PostgreSQLでの日付処理

PostgreSQLでの日付の扱いをいつも忘れるのでメモ
下記の結果は、2013/06/14 15時くらいの実行結果です

現在をとるのは


select 
current_timestamp
, now() -- current_timestampと同じ
;

結果
“2013-06-14 15:44:12.078+09”

日付の加算は


select 
 now() + '1 days'
;

結果
“2013-06-15 15:44:12.078+09”

日付を丸めるには


select 
  date_trunc('hour', now())
, date_trunc('day', now())
, date_trunc('month', now())
;

結果
“2013-06-14 15:00:00+09”
“2013-06-14 00:00:00+09”
“2013-06-01 00:00:00+09”

上記を利用すれば
今月1日からのログを表示、なんてできます


select *
from log_table
where settime > date_trunc('month', now());
;

null値があるときのpostgresqlでの集計結果について

sqlを発行して合算値が欲しいとき集計関数「sum()」を使います
ただ、NULL値を活かしたいときにいつも忘れてしまうのでまとめ

<sample1>
nullが含まれる

test table data
[key] [value]
1 10
2 10
3 null

select sum(value), avg(value) from test;
=>
20, 10

<sample2>
全部null

test table
[key] [value]
1 null
2 null
3 null

select sum(value), avg(value) from test;
=>
null, null

<sample3>
sumの結果を足すとき

test table
[key] [value1] [value2]
1 10 null
2 10 null
3 10 null

select sum(value1) + sum(value2) from test;
=>
null

null + 30 = nullとなってしまう

<sample4>
sumの結果を足すとき(null+30=30としたいとき)

test table
[key] [value1] [value2]
1 10 null
2 10 null
3 10 null

select coalesce(sum(value1),0) + coalesce(sum(value2),0) from test;
=>
30

null + null = nullとしたいとき、<sample4>を使うと「0」になってしまう…
SQLいい方法がないか模索中。