Hatena::Grouppostgresql

PostgreSQL 雑記 このページをアンテナに追加 RSSフィード

2011-04-22日付計算はPostgreSQLに任せよう

PostgreSQL は日付の計算がけっこう得意です。timestamp/date ⇔ interval/integer の変換を使うと、いろいろな計算ができます。

  • date + integer = date
  • date - date = integer
  • timestamp + interval = timestamp
  • timestamp - timestamp = interval

例えばこんなサンプルも:

閏年 23:31  閏年 - PostgreSQL 雑記 を含むブックマーク はてなブックマーク -  閏年 - PostgreSQL 雑記  閏年 - PostgreSQL 雑記 のブックマークコメント

2/28 の次の日が 3/1 で無いことをチェック。

SELECT 
    year, to_date(year || '0228', 'YYYYMMDD') + 1 <> to_date(year || '0301', 'YYYYMMDD') AS is_leap_year
FROM
    generate_series(1999, 2013) AS Y(year)

月ごとの日数 23:31  月ごとの日数 - PostgreSQL 雑記 を含むブックマーク はてなブックマーク -  月ごとの日数 - PostgreSQL 雑記  月ごとの日数 - PostgreSQL 雑記 のブックマークコメント

翌月1日から今月1日を引くだけ。

SELECT 
    tm::date, (tm + '1 month')::date - tm::date AS mdays
FROM
    generate_series('2011-01-01', '2012-12-31', interval '1 month') AS T(tm)

毎月第2金曜日 23:31  毎月第2金曜日 - PostgreSQL 雑記 を含むブックマーク はてなブックマーク -  毎月第2金曜日 - PostgreSQL 雑記  毎月第2金曜日 - PostgreSQL 雑記 のブックマークコメント

曜日 (dow) は 日曜日=0 .. 金曜日=5。

SELECT 
    tm::date, tm::date + 12 - extract('dow' FROM tm)::int AS second_friday
FROM
    generate_series('2011-01-01', '2012-12-31', interval '1 month') AS T(tm)