ねぎとろ放浪記

ねぎとろ放浪記

個人的備忘録です。勉強したことをまとめていきます。

SQLで日付の操作

日付とか年齢とかの計算方法を忘れがちなので備忘録。

よく使う日付に関する型は以下の2つです。

  • date型 : 日付まで。'YYYY-MM-DD'
  • timestamp型 : 日付と時間。'YYYY-MM-DD HH:MM:SS'

今回は以下の表を操作します。

date_test表

 int_date |   str_date   |       ts_date       
----------+--------------+---------------------
 20200101 | 2020年1月1日 | 2020-01-01 00:00:00
 20200201 | 2020年2月1日 | 2020-02-01 00:00:00
 20200301 | 2020年3月1日 | 2020-03-01 00:00:00


文字列からdate型への変更

TO_DATE()を使います。

SELECT TO_DATE(str_date, 'YYYY年mm月dd日')
FROM date_test;

実行結果

   to_date   
------------
 2020-01-01
 2020-02-01
 2020-03-01
(3 rows)


intからdate型に変更

文字列に変換してからdateに変換します。

SELECT TO_DATE(TO_CHAR(int_date, 'FM99999999'), 'YYYYmmdd')
FROM date_test;

実行結果

  to_date   
------------
 2020-01-01
 2020-02-01
 2020-03-01
(3 rows)


timestampからdate型に変更

CAST(カラム名 AS DATE)を使います。

SELECT CAST(ts_date AS DATE) 
FROM date_test;

実行結果

 ts_date  
------------
 2020-01-01
 2020-02-01
 2020-03-01
(3 rows)


日付に関する演算

期間内のレコードを取得

date型同士は普通に足し引きできる。

SELECT str_date 
FROM date_test
WHERE '2020-04-01' - TO_DATE(str_date, 'YYYY年mm月dd日') < 40; 

実行結果

    date    
------------
 2020-03-01
(1 row)

2020年4月1日から40日以内のレコードのみ取得しました。


年齢のカラムを作成してみる

2038年時点での年齢を計算しました。

SELECT ('2038-01-01' - CAST(ts_date AS DATE) )/365 as age 
FROM date_test;

実行結果

 age 
-----
  18
  17
  17