MaxCompute mendukung empat tipe data terkait tanggal dan waktu: DATE, DATETIME, TIMESTAMP, dan TIMESTAMP_NTZ. MaxCompute juga menyediakan tipe data INTERVAL, yang menunjukkan rentang waktu antara dua tanggal atau waktu. Topik ini menjelaskan penggunaan tipe INTERVAL.
Prasyarat
Untuk menggunakan tipe data INTERVAL, Anda harus mengaktifkan tipe data MaxCompute 2.0 dengan menyetel SET odps.sql.type.system.odps2=true;.
Petunjuk Penggunaan
Tipe data INTERVAL mendukung dua jenis:
INTERVAL_YEAR_MONTH: Menyimpan interval tahun-bulan menggunakan bidang
YEARdanMONTH.INTERVAL_DAY_TIME: Menyimpan interval hari-waktu dalam hari, jam, menit, detik, dan fraksi detik.
INTERVAL_YEAR_MONTH
Sintaksis
Format sintaksis
Deskripsi
Contoh
INTERVAL '<year | -year>-<month>' YEAR TO MONTH
Menentukan interval YEAR dan MONTH.
Interval 120 tahun dan 3 bulan:
INTERVAL '120-3' YEAR TO MONTH
INTERVAL '-120-3' YEAR TO MONTH
INTERVAL '<year | -year>' YEAR
Hanya menentukan interval YEAR.
Interval 9 tahun:
INTERVAL '9' YEAR
INTERVAL '-9' YEAR
INTERVAL '<month | -month>' MONTH
Hanya menentukan interval MONTH.
Interval 40 bulan (3 tahun dan 4 bulan):
INTERVAL '40' MONTH (setara dengan INTERVAL '3-4' YEAR TO MONTH)
INTERVAL '-40' MONTH (setara dengan INTERVAL '-3-4' YEAR TO MONTH)
Rentang Parameter Valid
year: [0, 9999].
month: [0, 11].
Perhatian
Ketika hanya menentukan interval MONTH, nilai bulan dapat melebihi 11, dengan nilai yang melebihi 11 dikonversi menjadi tahun untuk perhitungan. Kode berikut menunjukkan contohnya:
SELECT INTERVAL '200' MONTH;Hasil kembali:
+------------+ | _c0 | +------------+ | 16-8 | +------------+Ketika menentukan YEAR dan MONTH, nilai bulan tidak boleh melebihi 11. Kode berikut adalah contoh yang salah:
SELECT INTERVAL '-2021-12' YEAR TO MONTH;Hasil kembali:
FAILED: ODPS-0130161:[1,17] Parse exception - cannot parse -2021-12 as a valid INTERVAL_DAY_TIME
INTERVAL_DAY_TIME
Sintaksis
Format sintaksis
Deskripsi
Contoh
INTERVAL '<day | -day>' DAY
Hanya menentukan interval DAY.
Interval 1 hari:
INTERVAL '1' DAY
INTERVAL '-1' DAY
INTERVAL '<hour | -hour>' HOUR
Hanya menentukan interval HOUR.
Interval 1 jam:
INTERVAL '1' HOUR
INTERVAL '-1' HOUR
INTERVAL '<minute | -minute>' MINUTE
Hanya menentukan interval MINUTE.
Interval 1 menit:
INTERVAL '1' MINUTE
INTERVAL '-1' MINUTE
INTERVAL '<second | -second>' SECOND
Hanya menentukan interval SECOND.
Interval 1.1 detik:
INTERVAL '1.1' SECOND
INTERVAL '-1.1' SECOND
INTERVAL '<day | -day> <hour>' DAY TO HOUR
Menentukan interval DAY dan HOUR.
Interval 1 hari dan 23 jam:
INTERVAL '1 23' DAY TO HOUR
INTERVAL '-1 23' DAY TO HOUR
INTERVAL '<day | -day> <hour>:<minute>' DAY TO MINUTE
Menentukan interval DAY, HOUR, dan MINUTE secara bersamaan.
Interval 1 hari, 23 jam, dan 59 menit:
INTERVAL '1 23:59' DAY TO MINUTE
INTERVAL '-1 23:59' DAY TO MINUTE
INTERVAL '<day | -day> <second>' DAY TO SECOND
Menentukan interval DAY, HOUR, MINUTE, dan SECOND secara bersamaan.
Interval 1 hari, 23 jam, 59 menit, dan 59.999 detik:
INTERVAL '1 23:59:59.999' DAY TO SECOND
INTERVAL '-1 23:59:59.999' DAY TO SECOND
INTERVAL '<hour | -hour>:<minute>' HOUR TO MINUTE
Menentukan interval HOUR dan MINUTE.
Interval 23 jam dan 59 menit:
INTERVAL '23:59' HOUR TO MINUTE
INTERVAL '-23:59' HOUR TO MINUTE
INTERVAL '<hour | -hour>:<minute>:<second>' HOUR TO SECOND
Menentukan interval HOUR, MINUTE, dan SECOND secara bersamaan.
Interval 23 jam, 59 menit, dan 59.999 detik:
INTERVAL '23:59:59.999' HOUR TO SECOND
INTERVAL '-23:59:59.999' HOUR TO SECOND
INTERVAL '<minute | -minute>:<second>' MINUTE TO SECOND
Menentukan interval MINUTE dan SECOND.
Interval 59 menit dan 59.999 detik:
INTERVAL '59:59.999' MINUTE TO SECOND
INTERVAL '-59:59.999' MINUTE TO SECOND
Rentang Parameter Valid
day: [0, 2147483647].
hour: [0, 23].
minute: [0, 59].
second: [0, 59.999999999].
Perhatian
Ketika hanya menentukan interval HOUR, MINUTE, atau SECOND, nilainya dapat melebihi batas atas, dan kelebihannya akan dikonversi ke unit yang lebih besar. Kode berikut menunjukkan contohnya:
SELECT INTERVAL '24' HOUR; -- Setara dengan INTERVAL '1' DAY SELECT INTERVAL '60' MINUTE; -- Setara dengan INTERVAL '1' HOUR SELECT INTERVAL '6000' SECOND; -- Setara dengan INTERVAL '1:40' HOUR TO MINUTEPada penggunaan lainnya, nilai setiap parameter tidak boleh melebihi batas atas. Kode berikut salah:
SELECT INTERVAL '23:60' HOUR TO MINUTE;Hasil kembali:
FAILED: ODPS-0130161:[1,17] Parse exception - cannot parse 23:60 as a valid INTERVAL_DAY_TIME
Operasi
Skenario 1: Penjumlahan dan pengurangan antar tipe INTERVAL yang sama
Penjumlahan dan pengurangan didukung pada tipe INTERVAL yang sama, tetapi tidak didukung antara tipe INTERVAL_DAY_TIME dan INTERVAL_YEAR_MONTH yang berbeda.
Contoh 1: Penjumlahan antar tipe INTERVAL_DAY_TIME.
SELECT INTERVAL '24' HOUR + INTERVAL '23' HOUR;Hasil kembali:
+------------+ | _c0 | +------------+ | 1 23:00:00.000000000 | +------------+Contoh 2: Pengurangan antar tipe INTERVAL_DAY_TIME.
SELECT INTERVAL '24' HOUR + INTERVAL '-23' HOUR;Hasil kembali:
+------------+ | _c0 | +------------+ | 0 01:00:00.000000000 | +------------+Contoh 3: Pengurangan antar tipe INTERVAL_YEAR_MONTH.
SELECT INTERVAL '5-1' YEAR TO MONTH - INTERVAL '9-2' YEAR TO MONTH;Hasil kembali:
+------------+ | _c0 | +------------+ | -4-1 | +------------+Contoh 4 (salah): Operasi antara INTERVAL_DAY_TIME dan INTERVAL_YEAR_MONTH tidak didukung. Kode berikut salah:
SELECT INTERVAL '2000-1' YEAR TO MONTH + INTERVAL '1 23:59:59.999' DAY TO SECOND;Hasil kembali:
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) INTERVAL_YEAR_MONTH,INTERVAL_DAY_TIME for operator '+'
Skenario 2: Pengurangan tipe DATE, TIMESTAMP, atau TIMESTAMP_NTZ menghasilkan tipe INTERVAL_DAY_TIME
Pengurangan antara tipe DATETIME yang berbeda tidak didukung.
Contoh 1: Pengurangan antara dua tipe DATE.
SELECT DATE '2021-10-29' - DATE '2024-11-29';Hasil kembali:
+------------+ | _c0 | +------------+ | -1127 00:00:00.000000000 | +------------+Contoh 2: Pengurangan antara dua tipe TIMESTAMP.
SELECT TIMESTAMP '2024-11-29 00:01:10' - TIMESTAMP'2021-10-29 00:01:00';Hasil kembali:
+------------+ | _c0 | +------------+ | 1127 00:00:10.000000000 | +------------+Contoh 3 (salah): Pengurangan antara dua tipe DATETIME tidak didukung. Kode berikut salah:
SELECT DATETIME '2024-11-11 00:00:00' - DATETIME'2021-11-11 00:00:00';Hasil kembali:
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) DATETIME,DATETIME for operator '-'
Skenario 3: Penjumlahan dan pengurangan tipe DATE, TIMESTAMP, TIMESTAMP_NTZ dengan tipe INTERVAL menghasilkan tipe DATE, TIMESTAMP, TIMESTAMP_NTZ
Penjumlahan dan pengurangan antara tipe DATETIME dan tipe INTERVAL tidak didukung.
Contoh 1: Pengurangan tipe DATE dengan tipe INTERVAL_YEAR_MONTH.
SELECT DATE '2021-11-11' - INTERVAL '-1' MONTH;Hasil kembali:
+------------+ | _c0 | +------------+ | 2021-12-11 | +------------+Contoh 2: Pengurangan tipe TIMESTAMP_NTZ dengan tipe INTERVAL_DAY_TIME.
SELECT TIMESTAMP_NTZ'2024-11-29 00:01:10' - INTERVAL '1 23' DAY TO HOUR;Hasil kembali:
+------------+ | _c0 | +------------+ | 2024-11-27 01:01:10 | +------------+Contoh 3 (salah): Penjumlahan dan pengurangan antara tipe DATETIME dan tipe INTERVAL tidak didukung. Kode berikut salah:
SELECT DATETIME '2024-11-11 00:00:00' - INTERVAL '1 23' DAY TO HOUR;Hasil kembali:
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) DATETIME,INTERVAL_DAY_TIME for operator '-'