SQL Engine Reference (v11)

時刻と日付の関数

日付および時刻関数は、DATE や TIME のような日付または時刻のデータ型から成るデータの処理および操作に使用されます。

時刻と日付関数の値の挿入

関数の値をテーブルに挿入する場合、すべての日付/時刻関数でサポートされている 1 つの方法は、次に示すような INSERT ステートメント内で SELECT サブクエリを使用する方法です。

INSERT INTO t1 (c1, c2) SELECT CURRENT_DATE(), 
CURRENT_TIME() 

CURDATE()、CURTIME()、NOW() などのいくつかの関数では、次に示すような直接の INSERT もサポートされます。

INSERT INTO t1 (c1) VALUES (CURDATE())

表 56 時刻と日付の関数
関数
説明
CURDATE( )
現在の現地日付を 'yyyy-mm-dd' 形式で返します。デフォルトで、ローカル時計の時刻を使用します。SET TIME ZONE を呼び出した場合、CURDATE() の値は、システム時計とオペレーティング システムの地域の設定を基に UTC 日付/時刻を計算し、SET TIME ZONE で指定されたディスプレースメント値を加算することによって決定されます。
CURRENT_DATE( )
現在の UTC 日付を 'yyyy-mm-dd' 形式で返します。
CURTIME( )
現在の現地時刻を 'hh:mm:ss' 形式で返します。デフォルトで、ローカル時計の時刻を使用します。SET TIME ZONE を呼び出した場合、CURTIME() の値は、システム時計とオペレーティング システムの地域の設定を基に UTC 日付/時刻を計算し、SET TIME ZONE で指定されたディスプレースメント値を加算することによって決定されます。
CURRENT_TIME( )
現在の UTC 時刻を 'hh:mm:ss' 形式で返します。
CURRENT_TIMESTAMP( )
現在の UTC 日付と時刻をタイムスタンプ値として次の形式で返します。
'yyyy-mm-dd hh:mm:ss.mmm'
DATEADD(datepart, interval, date_exp)
日付に interval を加算した新しい DATETIME 値を返します。たとえば、datapart が day、interval が 11、date_exp が 2020 年 1 月 26 日の場合は、2020 年 2 月 6 日を返します。
datepart には interval を加算する日付の部分を指定します。値は以下のいずれかである必要があります。
year
quarter
month
day
dayofyear
week
hour
minute
second
millisecond
interval には、datepart を増加させるために用いる正または負の整数値を指定します。interval に小数部が含まれる場合、小数部は無視されます。
date_exp は DATETIME 値、暗黙的に DATETIME 値に変換される値、または DATE 形式の文字列を返す式です。「DATETIME」 を参照してください。
DATEDIFF(datepart, start, end)
2 つの日付の差異を表す整数を返します。この整数は、2 つの日付間の日付と時刻の境界の数です。
たとえば、テーブル mytest に col1 および col2 の 2 つの列があり、両方とも DATETIME だとします。col1 の値は 2000-01-01 11:11:11.234 で、col2 は 2004-09-11 10:10:10.211 です。次の SELECT ステートメントは 56 を返します。それが col1 と col2 の月の差異だからです。
SELECT DATEDIFF(month, col1, col2) as Month_Difference FROM mytest
datepart には差異を計算する日付の部分を指定します。値は以下のいずれかである必要があります。
year
quarter
month
day
dayofyear
week
hour
minute
second
millisecond
start には差異を計算する始まりの日付を指定します。start は DATETIME 値または DATE 形式の Unicode 文字列を返す式です。
end には差異を計算する終わりの日付を指定します。end は DATETIME 値または DATE 形式の Unicode 文字列を返す式です。
end から start が減算されます。戻り値が整数値の範囲外の場合はエラーが返されます。「データ型の範囲」を参照してください。
DATENAME(datepart, date_exp)
date_expdatepart を表す英語の文字列(VARCHAR)を返します。たとえば、datepart month は January、February というように月名を返します。datepart weekday は Monday、Tuesday というように曜日を返します。
datepart は返される日付の部分で、値は以下のいずれかである必要があります。
year
quarter
month
day
dayofyear
week
weekday
hour
minute
second
millisecond
date_exp は DATETIME 値、暗黙的に DATETIME 値に変換される値、または DATE 形式の文字列を返す式です。「DATETIME」 を参照してください。
DATEPART(datepart, date_exp)
date_expdatepart を表す整数を返します。たとえば、datepart month は月を表す整数を返します(1 月 = 1、2 月 = 2)。datepart weekday は曜日を表す整数を返します(日曜日 = 1、土曜日 = 7)。
datepart は返される日付の部分で、値は以下のいずれかである必要があります。
year
quarter
month
day
dayofyear
week
weekday
hour
minute
second
millisecond
TZoffset
TZoffset 値は、タイム ゾーンのオフセットを分数(符号付き)で返します。TZoffset を指定した DATEPART 関数は、SYSDATETIMEOFFSET() および、タイム ゾーンのオフセットを含んでいる文字列リテラルでのみ機能します。タイム ゾーン オフセットの範囲は -14:00 から +14:00 です。を参照してください。
date_exp は DATETIME 値、暗黙的に DATETIME 値に変換される値、または DATE 形式の文字列を返す式です。「DATETIME」 を参照してください。
DAY(date_exp)
指定された date_exp の日にちを返します。これは DATEPART(day, date_exp) とまったく同じです。DATEPART(datepart, date_exp) を参照してください。
DAYNAME(date_exp)
date_exp の曜日部分に対して、データ ソース固有の曜日の名前(たとえば、Sunday から Saturday)を含んでいる英語の文字列を返します。
date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
DAYOFMONTH(date_exp)
date_exp の月の何日目かを 1 ~ 31 の範囲の整数値で返します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
DAYOFYEAR(date_exp)
date_exp の年の何日目かを 1 ~ 366 の範囲の整数値で返します。
EXTRACT(extract_field, extract_source)
extract_sourceextract_field 部分を返します。引数 extract_source は、日付、時刻、または間隔を表す式です。
extract_field に指定できるキーワードは次のとおりです。
YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
これらの値は、ターゲット式から返されます。
HOUR(time_exp)
時刻を 0 ~ 23 の範囲の整数値で返します。time_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
MINUTE(time_exp)
分を 0 ~ 59 の範囲の整数値で返します。time_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
MONTH(date_exp)
月を 1 ~ 12 の範囲の整数値で返します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
MONTHNAME(date_exp)
date_exp の月の部分に対して、データ ソース固有の月名(たとえば、January から December)を含んでいる英語の文字列を返します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
NOW( )
現在の現地日付と時刻をタイムスタンプ値として次の形式で返します。
'yyyy-mm-dd hh:mm:ss.mmm'
デフォルトで、ローカル時計の時刻を使用します。SET TIME ZONE を呼び出した場合、NOW() の値は、システム時計とオペレーティング システムの地域の設定を基に UTC 日付/時刻を計算し、SET TIME ZONE で指定されたディスプレースメント値を加算することによって決定されます。
QUARTER(date_exp)
date_exp の四半期を 1 ~ 4 の範囲の整数値で返します。1 は 1 月 1 日~ 3 月 31 日を表します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
SECOND(time_exp)
秒を 0 ~ 59 の範囲の整数値で返します。time_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
SYSDATETIMEOFFSET
現在の日付と時刻に加えて、Pervasive PSQL データベース エンジンが起動しているコンピューターの現在のタイム ゾーンと UTC の間の時間と分のオフセットを返します。サマー タイム(DST)が考慮されます。
返されるデフォルトの書式は、YYYY-MM-DD hh:mm:ss[.nnnnnnn] [<+ | ->hh:mm] です。"+" は、現在のタイム ゾーンが UTC より進んでいることを示します。"-" は、現在のタイム ゾーンが UTC より遅れていることを示します。
TIMESTAMPADD(interval, integer_exp, timestamp_exp)
interval タイプの integer_exp で示された間隔を timestamp_exp に加算したタイムスタンプを返します。
interval に指定できるキーワードは次のとおりです。
SQL_TSI_YEAR
SQL_TSI_QUARTER
SQL_TSI_MONTH
SQL_TSI_WEEK
SQL_TSI_DAY
SQL_TSI_HOUR
SQL_TSI_MINUTE
SQL_TSI_SECOND
TIMESTAMPDIFF(interval, timestamp_exp1, timestamp_exp2)
timestamp_exp2timestamp_exp1 より大きい場合に、その差である interval の整数値を返します。
interval に指定できる値は、TIMESTAMPADD と同じです。
WEEK(date_exp)
date_exp が 1 年の第何週目かを 1 ~ 53 の範囲の整数値で返します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。
WEEKDAY(date_exp)
指定された date_exp の曜日を返します。1 = 日曜日、7 = 土曜日です。これは DATEPART(weekday, date_exp) とまったく同じです。DATEPART(datepart, date_exp) を参照してください。
YEAR(date_exp)
年数を整数値で返します。範囲はデータ ソースに依存します。date_exp には、日付リテラル、タイムスタンプ リテラル、または DATE、TIMESTAMP、DATETIME データが格納されている列を指定できます。

次の例は、日付/時刻関数を基に値を挿入する方法を示します。CURDATE() などのいくつかの関数は、INSERT ステートメントの中で直接使うことができます。しかし、それ以外の関数では、このような方法はサポートされていません。広範囲にわたってサポートされている方法は、SELECT を含む INSERT を使用するものです。以下の例では、CURRENT_TIME() によって返される UTC 時刻値がテーブル T1 に挿入されます。

INSERT INTO T1 (C1) SELECT CURRENT_TIME() 
666

次は HOUR の使用例です。

SELECT c.Name, c.Credit_Hours FROM Course c WHERE c.Name 
= ANY (SELECT cl.Name FROM Class cl WHERE c.Name = 
cl.Name AND c.Credit_Hours >(HOUR (Finish_Time - 
Start_Time) + 1)) 
666

これは MINUTE の使用例です。

SELECT minute(log) FROM billing 
666

次は SECOND の使用例です。

SELECT SECOND(log) FROM billing 
SELECT log FROM billing where SECOND(log) = 31 
666

次は NOW() の使用例です。

SELECT now() - log FROM billing 
666

次は、MONTH、DAY、YEAR、HOUR、MINUTE を複合的に使用した例です。

SELECT Name, Section, MONTH(Start_Date), 
DAY(Start_Date), YEAR(Start_Date), HOUR(Start_Time), 
MINUTE(Start_Time) FROM Class 
666

次は CURDATE() の使用例です。

SELECT ID, Name, Section FROM Class WHERE (Start_Date - 
CURDATE()) <= 2 AND (Start_Date - CURDATE()) >= 0 
666

次の例では、Class テーブルにあるクラスの開始日を基に、月の何日目かとその曜日を求めます。

SELECT DAYOFMONTH(Start_date), DAYOFWEEK(Start_date) 
from Class 
SELECT * FROM person WHERE YEAR(Date_Of_Birth) < 1970 
666

次は、TZoffset パラメーターを指定した DATEPART の使用例です。

SELECT DATEPART(TZoffset, SYSDATETIMEOFFSET()) 

ステートメントが -360 を返すとしたら、現在のタイム ゾーンは UTC より 360 分遅れています。

SELECT SYSDATETIMEOFFSET() が 2011-01-24 14:33:08.4650000 -06:00 を返すとします。これを前提として、次のクエリは -360 を返します。

SELECT DATEPART(TZoffset, '2011-01-24 14:33:08.4650000 -
06:00') 

タイム ゾーンの部分が文字列リテラルから省略されている場合は、0 が返されます。

SELECT DATEPART(TZoffset, '2011-01-24 14:33:08.4650000') 

数値関数

システム関数