日付と時刻を取得する(date関数, time関数, datetime関数, julianday関数, strftime関数)

date 関数、 time 関数、 datetime 関数、 julianday 関数、 strftime 関数を使うと現在または指定した日時の日付と時刻を取得することができます。ここでは SQLite における date 関数、 time 関数、 datetime 関数、 julianday 関数、 strftime 関数の使い方について解説します。

(Last modified: )

日付と時刻の取得方法

それぞれの関数は日付と時刻を取得する為に使用します。書式は次の通りです。

date(timestring, modifier, modifier, ...)
time(timestring, modifier, modifier, ...)
datetime(timestring, modifier, modifier, ...)
julianday(timestring, modifier, modifier, ...)
strftime(format, timestring, modifier, modifier, ...)

引数の timestring に日付と時刻を表す文字列を指定すると、それぞれの関数毎の指定のフォーマットに変換して値を返します。

各関数のフォーマットは次の通りです。

date関数      'YYYY-MM-DD'
time関数      'HH:MM:SS'
datetime関数  'YYYY-MM-DD HH:MM:SS'
julianday関数 'J'

date 関数に日付と時刻を表す文字列を引数として渡すと、日付の部分だけを YYYY-MM-DD の形式で返します。 time 関数であれば時刻の部分だけを HH:MM:SS の形式で返し、 datetime 関数ならば日付と時刻の値を両方返します。julianday 関数の場合はユリウス日を返します。

指定した日付と時刻のタイムゾーンはUTCとして扱われます。

また strftime 関数ではフォーマットを自分で指定します。他の関数は strftime 関数を使うことで同じことが行えます(あとで詳しくみていきます)。

-- --

引数に指定する日付と時刻を表す文字列は次のいずれかの形式で指定します。

YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
YYYY-MM-DDTHH:MM
YYYY-MM-DDTHH:MM:SS
YYYY-MM-DDTHH:MM:SS.SSS
HH:MM
HH:MM:SS
HH:MM:SS.SSS
now
DDDDDDDDDD

例えば '2019-08-22' や '14:10:25' 、または '2019-03-01 09:01:45' などです。時刻に関する値が省略された場合は '00:00:00.000' となります。また日付が省略された場合は '2000-01-01' となります。

また特別な値 'now' を指定するとと現在の日時と時刻を設定します。(タイムゾーンは UTC です)。

'DDDDDDDDDD' は Julian day (ユリウス日)の形式です。これはグレゴリオ暦の紀元前 4714年11月24日 の正午からの通算日で指定します。

date関数、time関数、datetime関数を使った日付と時刻の取得

それでは実際に試してみます。次のように SELECT 文を実行しました。( AS 句を使ってカラムに別名を付けています。詳しくは「取得データのカラムに別名を付ける(AS句)」を参照してください)。

select date('2018-05-12 13:15:42') as date,
  time('2019-08-04 08:42:19') as time,
  datetime('2019-11-30 21:16') as datetime;

日付と時刻の取得方法(1)

指定した日時から日付と時刻を取得することができました。

次に now を指定して現在の日付と時刻を取得してみます。

select date('now') as date,
  time('now') as time,
  datetime('now') as datetime;

日付と時刻の取得方法(2)

現在の日時(タイムゾーンはUTCです)の日付や時刻について取得することができました。

julianday関数を使った日付と時刻の取得

julianday関数は引数に指定した日付と時刻をユリウス日として取得します。ユリウス日とはグレゴリオ暦の紀元前4714年11月24日(ユリアス暦の紀元前4713年1月1日)の正午を基準日とし、基準日からの通算日を表したものです。単位は日です。また基準日は正午となっている点に注意して下さい。

日時                                 ユリウス日
----------------------------------------------
紀元前4713年11月24日 12:00:00.000    0
紀元前4713年11月25日 00:00:00.000    0.5
2000年1月1日 00:00:00.000           2451544.5
2000年1月1日 12:00:00.000           2451545

ユリウス日は単位が日となっていますので、小数点以下の値は次のように換算することができます。

0.1 = 2.4 時間 / 144 分 / 8640 秒
0.01 = 0.24 時間 / 14.4 分 / 864 秒
0.001 = 0.024 時間 / 1.44 分 / 86.4 秒
0.0001 = 0.0024 時間 / 0.144 分 / 8.64 秒
0.00001 = 0.00024 時間 / 0.0144 分 / 0.864 秒

それでは実際に試してみます。次のように SELECT 文を実行しました。( AS 句を使ってカラムに別名を付けています。詳しくは「取得データのカラムに別名を付ける(AS句)」を参照してください)。

select julianday('2019-08-04 08:42:19') as julianday;

julianday関数を使った日付と時刻の取得(1)

指定した日時からユリウス日を取得することができました。

strftime関数を使った日付と時刻の取得

他の関数では取得する結果のフォーマットが決められていましたが strftime 関数はフォーマットを指定することができます。

フォーマットの指定は任意の文字と下記の特殊な文字を組み合わせて指定します。

%Y  年: 0000-9999
%m  月: 01-12
%d  日
%W  年の初めからの週数: 00-53
%j  年の初めからの経過日数: 001-366
%w  曜日: 0-6 (日曜日が0、土曜日が6)
%H  時: 00-24
%M  分: 00-59
%S  秒: 00-59
%f  秒+ミリ秒: SS.SSS
%s  1970-01-01からの経過秒数
%J  ユリウス日
%%  %文字そのもの

他の日付と時刻に関する関数は strftime 関数を使って次のように表すことができます。

date(...)        strftime('%Y-%m-%d', ...)
time(...)        strftime('%H:%M:%S', ...)
datetime(...)    strftime('%Y-%m-%d %H:%M:%S', ...)
julianday(...)   strftime('%J', ...)

それでは実際に試してみます。次のように SELECT 文を実行しました。最初は現在時刻をミリ秒まで取得しています。

select strftime('%H:%M:%f', 'now') as strftime;

strftime関数を使った日付と時刻の取得(1)

次は任意の文字を組み合わせて 2019年1月1日 からの経過秒数を取得しています。

select strftime('経過秒数 %s秒', 'now') as strftime;

strftime関数を使った日付と時刻の取得(2)

Modifiers(修飾子)の使い方

それぞれの関数には引数に修飾子を1つまたは複数指定することができます。

date(timestring, modifier, modifier, ...)
time(timestring, modifier, modifier, ...)
datetime(timestring, modifier, modifier, ...)
julianday(timestring, modifier, modifier, ...)
strftime(format, timestring, modifier, modifier, ...)

指定可能な修飾子は次の通りです。

NNN years
NNN months
NNN days
NNN hours
NNN minutes
NNN.NNNN seconds
start of year
start of month
start of day
weekday N
unixepoch
localtime
utc

では順に確認していきます。

日時または時刻の要素を加算・減算

次の修飾子では対象の日付と時刻に対して、月や日、また時や分などの値を加算したり減算したりする場合に使います。

NNN years
NNN months
NNN days
NNN hours
NNN minutes
NNN.NNNN seconds

例えば 1 日加算するには '+1 days' と記述します。また 4 時間戻すには '-4 hours' と記述します。修飾子は複数指定できますので 1 日加算して 4 時間戻すこともできます。

それでは実際に試してみます。次のように SELECT 文を実行しました。

select datetime('2019-05-04', '+1 days') as datetime;
select datetime('2019-05-04', '-4 hours') as datetime;
select datetime('2019-05-04', '+2 days', '-4 hours') as datetime;

Modifiers(修飾子)の使い方(1)

加算や減算した結果、日や月などが変わる場合も自動的に計算されます。

最初の日と最初の時間

次の修飾子では対象の日付に対してその日付の年の最初の日などを返します。

start of year
start of month
start of day

'start of year' を指定すると、対象の日付の年の最初の日( 1月1日の00:00:00 )が返されます。 'start of month' と指定すると、対象の日付の月の最初の日( 1日の00:00:00 )が返されます。 'start of day' と指定すると、対象の日付の午前0時( 00:00:00 )が返されます。

それでは実際に試してみます。次のように SELECT 文を実行しました。

select datetime('2019-05-04 21:16', 'start of year') as datetime;
select datetime('2019-05-04 21:16', 'start of month') as datetime;
select datetime('2019-05-04 21:16', 'start of day') as datetime;

Modifiers(修飾子)の使い方(2)

指定した曜日の日

次の修飾子では対象の日付以降の日付で指定した曜日の最初の日を返します。

weekday N

Nには曜日を表す数値を指定します。 0 が日曜日で 6 が土曜日となります。

それでは実際に試してみます。次のように SELECT 文を実行しました。

select datetime('2019-05-04', 'weekday 0') as datetime;
select datetime('2019-05-04', 'weekday 3') as datetime;

Modifiers(修飾子)の使い方(3)

UNIXタイムスタンプでの指定

次の修飾子を指定すると、日付の指定を'DDDDDDDDDD'の形式で指定した時に、ユリウス日ではなくUNIXタイムスタンプでの値として処理します。

unixepoch

UNIXタイムスタンプとは1970年1月1日午前0時からの経過秒数です。よって'DDDDDDDDDD'の形式で指定した値の単位は秒数として扱われます。

それでは実際に試してみます。次のように SELECT 文を実行しました。

select datetime('35') as datetime;
select datetime('35', 'unixepoch') as datetime;

Modifiers(修飾子)の使い方(4)

ローカルタイムゾーンでの表示

次の修飾子を指定すると、対象の日付をローカルのタイムゾーンに変換します。

localtime

デフォルトでは対象の日付と時刻のタイムゾーンは UTC (協定世界時)として扱われます。 localtime を指定すると、 UTC タイムゾーンとして処理された日付と時刻をローカルのタイムゾーンでの日付と時刻に変換して返してくれます。

日本の場合は JST (日本標準時)に変換しますが、 JST は UTC に +09:00 したものです。

それでは実際に試してみます。次のように SELECT 文を実行しました。

select datetime('now') as utc, datetime('now', 'localtime') as local;

Modifiers(修飾子)の使い方(5)

UTCタイムゾーンでの表示

次の修飾子を指定すると、対象の日付を UTC タイムゾーンに変換します。

utc

'utc' を指定した場合だけ、対象の日付のタイムゾーンをローカルタイムゾーンとして扱います。そして対象の日付と時刻を UTC タイムゾーンに変換して返してくれます。

日本の場合は対象の日付と時刻のタイムゾーンを JST (日本標準時)として扱い、 UTC タイムゾーンに変換します。

それでは実際に試してみます。次のように SELECT 文を実行しました。

select datetime('2019-05-14 10:25') as utc, datetime('2019-05-14 10:25', 'utc') as local;

Modifiers(修飾子)の使い方(6)

-- --

日付と時刻に関する関数の使い方について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。