ここでは、MaxCompute SQLで Datetime 型を操作するためのさまざまな関数について説明します。
DATEADD
datetime dateadd(datetime date, bigint delta, string datepart)
コマンドの説明:
指定した単位「datepart」と範囲「delta」に従って、日付の値を変更します。
パラメーターの説明:
- date: Datetime 型で、日付の値です。 入力値が String 型の場合、暗黙の変換によって「Datetime」型に変換されます。 それ以外のデータ型の場合は、例外が報告されます。
- delta: Bigint 型で、変更対象の日付範囲です。 入力値が「String」型または「Double」型の場合、暗黙の変換によって「Bigint」型に変換されます。 それ以外のデータ型の場合は、例外が発生します。「delta」が 0 より大きい場合は「足し算」、そうでない場合は、「引き算」を行います。
- datepart: String 型の定数です。 このフィールド値は、「String」と「Datetime」型の変換規則に従い指定します。つまり、「yyyy」は年を示し、「mm」は月を示します。
「String 型 と Datetime 型の変換」をご参照ください。 さらに、拡張日付形式 (年 -「year」、月 -「month」または 「mon」、日 -「day」、 時間 -「hour」) も使用できます。 定数でない場合、サポート対象外の形式の場合、その他のデータ型の場合は、例外が報告されます。
戻り値: Datetime 型。入力値に NULL がある場合は、 NULL が返されます。
- 指定した単位に応じて「delta」が増減し、単位の上位桁が溢れたり、スペースで埋められることがあります 日、月、時、分、秒は、それぞれ 10 進数、12 進数、24 進数、60 進数、60 進数で計算されます。
- 「delta」の単位が月の場合の計算ルールは次のとおりです。
「delta」を加えた後に、「Datetime」の月部分によって日が溢れない場合は、日付は変わりません。そうでない場合、日の値は結果月の最終日に設定されます。
- 「datepart」の値は「String」型と「Datetime」型の変換規則に従います。つまり、「yyyy」は年、「mm」は月を示します。 特別な説明がない限り、関連する Datetime 型の組み込み関数はすべてこの規則に従います。 また、特別な指示がない限り、すべての Datetime 組み込み関数も拡張日付形式(年- 「year」、月- 「month」または 「mon」、日-「day」、 時間-「hour」)に対応します。
if trans_date = 2005-02-28 00:00:00
dateadd(trans_date, 1, 'dd') = 2005-03-01 00:00:00
-- 1 日追加します。 結果は 2 月の最終日より大きくなります。 実際の値は、翌月の初日です。
dateadd(trans_date, -1, 'dd') = 2005-02-27 00:00:00
-- 1 日引きます。
dateadd(trans_date, 20, 'mm') = 2006-10-28 00:00:00
-- 20 か月追加します。 月が溢れ、年に ‘1’ が追加されます。
If trans_date = 2005-02-28 00:00:00, dateadd(transdate, 1, 'mm') = 2005-03-28 00:00:00
If trans_date = 2005-01-29 00:00:00, dateadd(transdate, 1, 'mm') = 2005-02-28 00:00:00
-- 2005 年 2 月 29 日 この日付が、現在の月の最終日に割り込まれます。
If trans_date = 2005-03-30 00:00:00, dateadd(transdate, -1, 'mm') = 2005-02-28 00:00:00
select dateadd(2005-03-30 00:00:00, -1, 'mm') from tbl1;
select dateadd(cast("2005-03-30 00:00:00" as datetime), -1, 'mm') from tbl1;
-- String 型の定数は、暗黙の変換によって datatime 型に変換されます。
DATEDIFF
bigint datediff(datetime date1, datetime date2, string datepart)
コマンドの説明:
指定した時間単位「datepart」で、Datetime 型である date1 と date2 の 2 つの差を計算します。
- datet1、date2: Datetime 型、被減数、減数分裂。 入力値が「String」型の場合、暗黙の変換によって「Datetime」型に変換されます。 それ以外のデータ型の場合は、例外が報告されます。
- datepart: String 型の定数です。拡張日付形式に対応しています。 「datepart」が指定した形式になっていない場合、または他のデータ型の場合、例外が報告されます。
戻り値:
Bigint 型が返されます。 入力値に NULL がある場合は、NULL が返されます。 date1 が date2 より小さい場合、戻り値は負になる可能性があります。
If start = 2005-12-31 23:59:59, end = 2006-01-01 00:00:00:
datediff(end, start, 'dd') = 1
datediff(end, start, 'mm') = 1
datediff(end, start, 'yyyy') = 1
datediff(end, start, 'hh') = 1
datediff(end, start, 'mi') = 1
datediff(end, start, 'ss') = 1
datediff('2013-05-31 13:00:00', '2013-05-31 12:30:00', 'ss') = 1800
datediff('2013-05-31 13:00:00', '2013-05-31 12:30:00', 'mi') = 30
If start = 19:33:23. 234, end = 19:33:23. 250 .Dates with milliseconds do not belong to the standard datetime style, and cannot be converted implicitly directly.Explicit conversion is required here:
datediff(to_date('2018-06-04 19:33:23.250', 'yyyy-MM-dd hh:mi:ss.ff3'),to_date('2018-06-04 19:33:23.234', 'yyyy-MM-dd hh:mi:ss.ff3') , 'ff3') = 16
DATEPART
bigint datepart(datetime date, string datepart)
コマンド形式:
「date」の「datepart」で指定された時間単位の値を取得します。
パラメーターの説明:
- date: Datetime 型。 入力値が「String」型の場合、「Datetime」型に変換されます。 それ以外のデータ型の場合は、例外が報告されます。
- datepart: String 型の定数です。 拡張日付形式を使用できます。 「datepart」が指定された形式を満たさないか、または他のデータ型である場合、例外が報告されます。
Bigint 型が返されます。 入力値に NULL がある場合は、 NULL が返されます。
datepart('2013-06-08 01:10:00', 'yyyy') = 2013
datepart('2013-06-08 01:10:00', 'mm') = 6
DATETRUNC
datetime datetrunc (datetime date, string datepart)
使用法:
指定した時間単位「datepart」が切り捨てた後、残りの日数値を返します。
- date: Datetime 型。 入力値が「String」型の場合、「Datetime」型に変換されます。 それ以外のデータ型の場合は、例外が報告されます。
- datepart: String 型の定数です。 拡張日付形式を使用できます。「datepart」が指定された形式を満たさないか、または他のデータ型である場合、例外が報告されます。
戻り値:
Datetime 型。 入力値に NULL がある場合は、 NULL が返されます。
datetrunc('2011-12-07 16:28:46', 'yyyy') = 2011-01-01 00:00:00
datetrunc('2011-12-07 16:28:46', 'month') = 2011-12-01 00:00:00
datetrunc('2011-12-07 16:28:46', 'DD') = 2011-12-07 00:00:00
GETDATE
datetime getdate()
コマンドの説明:
現在のシステム時間を取得します。 MaxCompute の標準時として UTC+8 が使用されます。
戻り値:
Datetime 型。現在の日付と時刻が返されます。
ISDATE
boolean isdate(string date, string format)
コマンドの説明:
対応する形式の文字列に従って、日付文字列を Datetime 型の値に変換できるかどうかを判断します。 変換が成功した場合は TRUE を返し、失敗した場合は FALSE を返します。
- date: String 型の日付値です。 入力値が「Bigint 型」、「Double 型」または「Datetime 型」の場合、「String」型に変換されます。 それ以外のデータ型の場合は、例外が報告されます。
- format: String 型の定数です。 日付の拡張形式は使用できません。 冗長な形式の文字列が「format」で指定されると、形式の最初の文字列に対応する Datatime 値ガ取得されます。他の文字列は区切り文字として扱われます。 たとえば、isdate (「1234-yyyy」、「yyyy-yyyy」) の場合は「TRUE」が返されます。
戻り値:
Boolean 型。 NULL の入力パラメータ値がある場合は、NULL が返されます。
LASTDAY
datetime lastday(datetime date)
コマンド形式:
その月の最後の日を取得します。日までの単位は切り捨てられ、「hh:mm:ss」部分は「00:00:00」となります。
パラメーターの説明:
date: Datetime 型。 入力値が「String」型の場合、「Datetime」型に変換されます。 それ以外のデータ型の場合は、例外が報告されます。
戻り値:
Datetime 型になります。 入力パラメーター値が NULL の場合は、 NULL が返されます。
TO_DATE
datetime to_date(string date, string format)
コマンドの説明:
指定された形式に従って、「date」の文字列を Datetime 型の値に変換します。
- date: String 型で、変換対象の日付値です。 入力値が「Bigint」型、「Double」型、「Datetime」型の場合、暗黙の変換によって「String」型に変換されます。 それ以外のデータ型または NULL の場合は、例外が報告されます。
- format: String 型の定数で日付形式です。定数でないか、他のデータ型である場合は、例外が発生します。 フィールド "format" は拡張形式に対応しておらず、他の文字は分析プロセスで
無効な文字として無視されます。
パラメーター format には少なくとも「yyyy」が含まれている必要があります。そうでなければ、例外が報告されます。 冗長な形式の文字列が format で指定されると、形式の最初の文字列に対応する Datatime 型の値が取得されます。他の文字列は区切り文字として扱われます。 たとえば、
to_date (‘1234-2234’, ‘yyyy-yyyy’)
は、「1234-01-01 00:00:00」と返されます。format 形式:yyyy は 4 桁の年、mm は 2 桁の月、DD は 2 桁の日、HH は 24 時間制、MI は 2 桁の分、SS は 2 桁の秒、FF3 は 3 桁の精度のミリ秒です。
戻り値:
Datetime 型で、形式は yyyy-mm-dd hh: mi: ss になります。 入力値に NULL がある場合は、 NULL が返されます。
to_date('Alibaba2010-12*03', 'Alibabayyyy-mm*dd') = 2010-12-03 00:00:00
to_date('20080718', 'yyyymmdd') = 2008-07-18 00:00:00
to_date('200807182030','yyyymmddhhmi')=2008-07-18 20:30:00
to_date('2008718', 'yyyymmdd') = null
-- 形式が要件を満たしていません。 例外が発生します。
to_date('Alibaba2010-12*3', 'Alibabayyyy-mm*dd') = null
-- 形式が非互換のため、例外が発生します。
to_date('2010-24-01', 'yyyy') = null
-- 形式が非互換のため、例外が発生します。
to_date('20181030 15-13-12.345','yyyymmdd hh-mi-ss.ff3')=2018-10-30 15:13:12
TO_CHAR
string to_char(datetime date, string format)
コマンドの説明:
指定した形式に従って、Datetime 型の「日付」を String 型に変換します。
- date: Datetime 型で、変換対象の日付値です。 入力値が「String」型の場合、暗黙の変換によって「Datetime」型に変換されます。 それ以外のデータ型の場合は、例外が報告されます。
- format: String 型の定数です。 定数でない場合、または他のデータ型の場合は、例外が報告されます。 「format」の日付形式の部分が対応するデータに置き換えられ、他の文字は直接出力されます。
戻り値:
String 型が返されます。 NULL の入力パラメータ値がある場合は、NULL が返されます。
to_char('2010-12-03 00:00:00', 'Alibabayyyy-mm*dd') = 'Alibaba2010-12*03'
to_char('2008-07-18 00:00:00', 'yyyymmdd') = '20080718'
to_char('Alibaba2010-12*3', 'Alibabayyyy-mm*dd') -- -- 形式が非互換のため、例外が発生します。
to_char('2010-24-01', 'yyyy') -- -- 形式が非互換のため、例外が発生します。
to_char('2008718', 'yyyymmdd') -- -- 形式が非互換のため、例外が発生します。
他のデータ型から String 型への変換については、「TO_CHAR」をご参照ください。
UNIX_TIMESTAMP
bigint unix_timestamp(datetime date)
コマンドの説明:
Datetime 型の日付を Bigint 型の UNIX 形式の日付に変換します。
パラメーターの説明:
date: Datetime 型の日付値です。 入力値が「String」型の場合、「Datetime」型に変換され、計算で使用されます。 それ以外のデータ型の場合は、例外が報告されます。
戻り値:
Bigint 型で、UNIX 形式の日付値が返されます。 「date」が NULL の場合は NULL が返されます。
FROM_UNIXTIME
datetime from_unixtime(bigint unixtime)
コマンドの説明:
UNIXの時間値である「unixtime」をDatetime 型の日時値に変換します。
パラメーターの説明:
unixtime: Bigint 型の秒数です。UNIX 形式の日時値です。 入力値が、「String」型、 「double」型の場合は、暗黙的な変換によって「Bigint」型に変換されます。
戻り値:
Datetime 型の日付値になります。 「unixtime」が NULL の場合は、NULL が返されます。
from_unixtime(123456789) = 1973-11-30 05:33:09
WEEKDAY
bigint weekday(datetime date)
コマンドの説明:
日付に対応する現在の週の n 日目を返します。
パラメーターの説明:
date: Datetime 型。 入力値が「String」型の場合は、「Datetime」型に変換されてから演算に使用されます。 それ以外のデータ型の場合は、例外が報告されます。
戻り値:
Bigint 型。 入力パラメータ値が NULL の場合は NULL が返されます。 月曜日は週の最初の日とみなされ、対応する戻り値は 0 です。 他の曜日は 0 から昇順となります。 日曜日の場合、戻り値は 6 です。
WEEKOFYEAR
bigint weekofyear(datetime date)
コマンドの説明:
パラメーターの説明:
date: Datetime 型。 入力値が「String」型の場合、「Datetime」型に変換されてから演算に使用されます。 それ以外のデータ型の場合は、例外が報告されます。
戻り値:
Bigint 型。 入力値が NULL の場合は、NULL が返されます。
select weekofyear(to_date("20141229", "yyyymmdd")) from dual;
結果:
+------------+
| _c0 |
+------------+
| 1 |
+------------+
-20141229 は 2014 に属しますが、この週の日付の大部分は 2015 です。したがって、戻される結果は 1 で、2015 の第 1 週であることを示します。
select weekofyear(to_date("20141231", "yyyymmdd")) from dual;
-- 1 を戻します。
select weekofyear(to_date("20141229", "yyyymmdd")) from dual;
-- 53 を戻します。
Maxcomputerte 2.0 に新しく追加された算術関数
set odps.sql.type.system.odps2=true;--Enable the new type.
set odps.sql.type.system.odps2=true;
select year('1970-01-01 12:30:00')=1970 from dual;
新規拡張関数の説明は、次のとおりです。
YEAR
INT year(string date)
コマンドの説明:
日付が属する年を返します。
パラメーターの説明:
date: String 型の日付値です。 形式には少なくとも「yyyy-mm-dd」を含める必要があり、追加の文字列を含めることはできません。 それ以外の場合は、NULL が返されます。
戻り値:
Int 型 。
year('1970-01-01 12:30:00') = 1970
year('1970-01-01') = 1970
year('70-01-01') = 70
year(1970-01-01) = null
year('1970/03/09') = null
year(null) Returns an exception
QUARTER
INT quarter(datetime/timestamp/string date )
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
日付の四半期で、1~4 が返されます。
パラメーターの説明:
date: Datetime 型、Timestamp 型、String 型のいずれかの日付値です。 形式には少なくとも「yyyy-mm-dd」を含める必要があります。 それ以外の場合は、NULL が返されます。
戻り値:
Int 型。入力値が NULL の場合は、NULL が返されます。
quarter('1970-11-12 10:00:00') = 4
quarter('1970-11-12') = 4
MONTH
INT month(string date)
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
日付が属する月を返します。
パラメーターの説明:
date: String 型の日付値です。 それ以外のデータ型の値の場合は、例外が返されます。
戻り値:
Int 型。
month('2014-09-01') = 9
month('20140901') = null
DAY
INT day(string date)
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
日付の曜日を返します。
パラメーターの説明:
date: String 型の日付値です。 それ以外の データ型の値の場合は、例外が返されます。
戻り値:
Int 型。
day('2014-09-01') = 1
day('20140901') = null
DAYOFMONTH
INT dayofmonth(date)
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
日付の日の部分を返します。
たとえば、コマンド int dayofmonth(2017-10-13)
を実行すると、13 が返されます。
パラメーターの説明:
date: String 型の日付値です。 それ以外のデータ型の値の場合は、例外が返されます。
戻り値:
Int 型。
dayofmonth('2014-09-01') = 1
dayofmonth('20140901') = null
HOUR
INT hour(string date)
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
日付の時間を返します。
パラメーターの説明:
date: String 型の日付値です。 それ以外のデータ型の値の場合は、例外が返されます。
戻り値:
Int 型。
hour('2014-09-01 12:00:00')=12
hour('12:00:00')=12
hour('20140901120000')=null
MINUTE
INT minute(string date)
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
日付の分の部分を返します。
パラメーターの説明:
date: String 型の日付値です。 それ以外のデータ型の値の場合は、例外が返されます。
戻り値:
Int 型。
minute('2014-09-01 12:30:00') = 30
minute('12:30:00') = 30
minute('20140901120000') = null
SECOND
INT second(string date)
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
日付の秒の部分を返します。
パラメーターの説明:
date: String 型の日付値です。 それ以外のデータ型の値の場合は、例外が返されます。
戻り値:
Int 型。
second('2014-09-01 12:30:45') = 45
second('12:30:45') = 45
second('20140901123045') = null
CURRENT_TIMESTAMP
timestamp current_timestamp()
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
現在のタイムスタンプを Timestamp 型の値として返します。 この値は固定値ではありません。
戻り値:
Timestamp 型。
select current_timestamp() from dual;--Returns '2017-08-03 11:50:30.661'
ADD_MONTHS
string add_months(string startdate, int nummonths)
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
「startdate」に「nummonths」の値を加えた日付を返します。
- startdate: String 型の値です。 形式には少なくとも「yyyy-mm-dd」を含める必要があり それ以外の場合は、NULL が返されます。
- num_months: Int 型の値です。
戻り値:
String 型の日付が「yyyy-mm-dd」の形式で返されます。
Add_months ('2017-02-14', 3) = '2017-05-14'
add_months('17-2-14',3) = '0017-05-14'
add_months('2017-02-14 21:30:00',3) = '2017-05-14'
add_months('20170214',3) = null
LAST_DAY
string last_day(string date)
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
指定した日付を含む月の最後の日付を返します。
パラメーターの説明:
date: String 型で、形式は「yyyy-MM-dd HH:mi:ss」または「yyyy-MM-dd」です。
戻り値:
String 型の日付が「yyyy-mm-dd」の形式で返されます。
last_day('2017-03-04') = '2017-03-31'
last_day('2017-07-04 11:40:00') = '2017-07-31'
last_day('20170304') = null
NEXT_DAY
string next_day(string startdate, string week)
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
startdate パラメーターで指定した 日付以降で、week パラメーターで指定した曜日に一致する最初の日付を返します。 つまり、翌週の特定の曜日の日付です。
- startdate: String 型で、形式は「yyyy-MM-dd HH:mi:ss」または「yyyy-MM-dd」です。
- week: String 型で、曜日の最初の 2 文字または 3 文字、または曜日のフルネームです。 たとえば、Mo、TUE、FRIDAY です。
戻り値:
String 型の日付が「yyyy-mm-dd」の形式で返されます。
next_day('2017-08-01','TU') = '2017-08-08'
next_day('2017-08-01 23:34:00','TU') = '2017-08-08'
Next_day ('20170801 ', 'tu') = NULL
MONTHS_BETWEEN
double months_between(datetime/timestamp/string date1, datetime/timestamp/string date2)
set odps.sql.type.system.odps2=true;
を追加します。
コマンドの説明:
date1と date2 の間の月数を返します。
- date1: Datetime 型、Timestamp 型、String 型のいずれかで、形式は「yyyy-MM-dd HH:mi:ss」または「yyyy-MM-dd」です。
- date2: Datetime 型、Timestamp 型、String 型のいずれかで、形式は「yyyy-MM-dd HH:mi:ss」または「yyyy-MM-dd」です。
戻り値:
- date1 が date2 より後の場合、戻り値は正の数になります。 date2 が date1 より後の場合、戻り値は負の数になります。
- date1 と date2 が 、2 か月の最後の日の場合、戻り値は月数を表す整数です。 それ以外の場合の式は、(date1 - date2)/31 です。
months_between('1997-02-28 10:30:00', '1996-10-30') = 3.9495967741935485
months_between('1996-10-30','1997-02-28 10:30:00' ) = -3.9495967741935485
months_between('1996-09-30','1996-12-31') = -3.0