ここでは、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
"trans_date" の値は、例としてのみ使用します。 この基本的な式は、ファイルの日付と時間を表示するためによく使用されます。
MaxCompute SQLでは、Datetime 型は直接の定数表現を持たないので、次の使い方は間違っています。
select dateadd(2005-03-30 00:00:00, -1, 'mm') from tbl1;
Datetime 型の定数を記述する必要がある場合は、次の方法で記述します。
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 つの差を計算します。

パラメーターの説明:
  • datet1date2: Datetime 型、被減数、減数分裂。 入力値が「String」型の場合、暗黙の変換によって「Datetime」型に変換されます。 それ以外のデータ型の場合は、例外が報告されます。
  • datepart: String 型の定数です。拡張日付形式に対応しています。 「datepart」が指定した形式になっていない場合、または他のデータ型の場合、例外が報告されます。

戻り値:

Bigint 型が返されます。 入力値に NULL がある場合は、NULL が返されます。 date1 が date2 より小さい場合、戻り値は負になる可能性があります。

計算過程で「datepart」に従って単位の下部分が切り捨てられ、計算結果が返されます。
例:
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 型。現在の日付と時刻が返されます。

(分散方式で実行される)MaxCompute SQLタスクでは、「getdate」は常に固定値を返します。 返される結果は、MaxCompute の SQL 実行期間内の任意の時刻になり、時間の精度は秒になります。

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)

コマンドの説明:

日付が含まれる年の n 番目の週を返します。 月曜日は週の最初の日とします。
今週が今年に属しているか翌年に属しているかは、今週の時間の大部分 (4日以上) がどの年に属しているかによって決まります。

パラメーターの説明:

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 に新しく追加された算術関数

MaxCompute 2.0 のアップグレード版では、新規の日付関数がいくつか追加されています。 新規関数を使用して、Hive モードと互換性のある新しいデータ型を設計する場合は、新規関数の SQL 文の前に次の 2 つの set 文を追加する必要があります。
set odps.sql.type.system.odps2=true;--Enable the new type.
両方を同時に送信するには、次の SQL 文を実行します。
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 )
新しいデータ型を使用するには、QUARTER 関数を指定する SQL 文の前に、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)
新しいデータ型を使用するには、MONTH 関数を指定する SQL 文の前に、set odps.sql.type.system.odps2=true; を追加します。

コマンドの説明:

日付が属する月を返します。

パラメーターの説明:

date: String 型の日付値です。 それ以外のデータ型の値の場合は、例外が返されます。

戻り値:

Int 型。

例:
month('2014-09-01') = 9
month('20140901') = null

DAY

コマンド形式:
INT day(string date)
新しいデータ型を使用するには、DAY 関数を指定する SQL 文の前に、set odps.sql.type.system.odps2=true; を追加します。

コマンドの説明:

日付の曜日を返します。

パラメーターの説明:

date: String 型の日付値です。 それ以外の データ型の値の場合は、例外が返されます。

戻り値:

Int 型。

例:
day('2014-09-01') = 1
day('20140901') = null

DAYOFMONTH

コマンド形式:
INT dayofmonth(date)
新しいデータ型を使用するには、DAYOFMONTH 関数を指定する SQL 文の前に、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)
新しいデータ型を使用するには、HOUR 関数を指定する SQL 文の前に、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)
新しいデータ型を使用するには、MINUTE 関数を指定する SQL 文の前に、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)
新しいデータ型を使用するには、SECOND 関数を指定する SQL 文の前に、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()
新しいデータ型を使用するには、CURRENT_TIMESTAMP 関数を指定する SQL 文の前に、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)
新しいデータ型を使用するには、ADD_MONTHS 関数を指定する SQL 文の前に、 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)
新しいデータ型を使用するには、LAST_DAY 関数を指定する SQL 文の前に、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)
新しいデータ型を使用するには、NEXT_DAY 関数を指定する SQL 文の前に、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)
新しいデータ型を使用するには、MONTHS_BETWEEN 関数を指定する SQL 文の前に、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」です。

戻り値:

Double 型。
  • 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