最近仕事で
SQLite » Date And Time Functions
PostgreSQL » Date/Time Functions and Operators
まず
sqlite> select datetime('now'); 2016-06-13 03:20:59
形式は
sqlite> select datetime(strftime('%s', 'now'), 'unixepoch', 'localtime'); 2016-06-13 12:27:56
もっと簡単なクエリがあるかもしれませんが、とりあえずこれで。当面
ゼロ埋めされてない年月日・時分秒があると、SQLite
sqlite> select strftime('%s', '2016-06-01 01:23:45'); -- return unixepoch sqlite> select strftime('%s', '2016-6-1 1:23:45');-- return empty
PostgreSQL
# select current_timestamp; +-------------------------------+ | now | +-------------------------------+ | 2016-06-13 20:08:14.463732+09 | +-------------------------------+ (1 row) # select now(); +------------------------------+ | now | +------------------------------+ | 2016-06-13 20:08:24.43215+09 | +------------------------------+ (1 row)
秒の小数点以下とタイムゾーンを省くには、先日書いたdate_trunc
# select date_trunc('second', now() :: timestamp); +---------------------+ | date_trunc | +---------------------+ | 2016-06-13 12:33:57 | +---------------------+ (1 row)-- now()そのままだとタイムゾーンが入る # select date_trunc('second', now()); +------------------------+ | date_trunc | +------------------------+ | 2016-06-13 12:37:12+09 | +------------------------+ (1 row) # select to_char(now(), 'YYYY-mm-dd HH:mm:ss'); +---------------------+ | to_char | +---------------------+ | 2016-06-13 12:06:48 | +---------------------+ (1 row)
ちょっと細かい話で、二つのクエリとも秒の小数点以下の丸めは四捨五入ででなく切り捨て。date_trunc
-- 秒の小数点以下は、切り捨て # select date_trunc('second', timestamp '2016-7-8 1:23:45.999'); +---------------------+ | date_trunc | +---------------------+ | 2016-07-08 01:23:45 | +---------------------+ (1 row) -- 同じく # select to_char(timestamp '2016-7-8 1:23:45.999', 'YYYY-mm-dd HH:mm:ss'); +---------------------+ | to_char | +---------------------+ | 2016-07-08 01:07:45 | +---------------------+ (1 row) -- to_charの数値フォーマットは四捨五入 # select to_char(98.7, 'FM00'); +---------+ | to_char | +---------+ | 99 | +---------+ (1 row)
上のようにゼロ埋めされてない日付・時刻文字列(2016-7-8 1:23:45)も、タイムスタンプ型として普通に渡せるのが
# select timestamp '2016-7-8 1:23:45'; +---------------------+ | timestamp | +---------------------+ | 2016-07-08 01:23:45 | +---------------------+ (1 row)
最後に念のため。date_trunc
-- データの型を見るにはpg_typeof関数 # select pg_typeof( date_trunc('second', now() :: timestamp)), pg_typeof( to_char(now(), 'YYYY-mm-dd HH:mm:ss')); +-----------------------------+-----------+ | pg_typeof | pg_typeof | +-----------------------------+-----------+ | timestamp without time zone | text | +-----------------------------+-----------+ (1 row) -- フォーマットを整形、そして1日後にずらす # select date_trunc('second', now() :: timestamp) + '1day'; +---------------------+ | ?column? | +---------------------+ | 2016-06-14 12:35:05 | +---------------------+ (1 row)