Fungsi DATEDIFF menghitung selisih antara tanggal akhir end_date dan tanggal awal start_date, dalam satuan waktu yang ditentukan oleh parameter date_part.
Sintaks
BIGINT | INT DATEDIFF(STRING|DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <end_date>, STRING|DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <start_date>[, STRING <date_part>])
-- Contoh standar.
-- Mengembalikan 1.
SELECT DATEDIFF(DATE '2025-03-02', DATE '2025-03-01', 'dd');Parameter
end_date, start_date: Wajib. Menentukan tanggal atau timestamp. Tipe data yang didukung adalah STRING, DATE, DATETIME, TIMESTAMP, dan TIMESTAMP_NTZ.
Jika input berupa STRING, perilaku fungsi bergantung pada format string tersebut dan edisi tipe data MaxCompute.
date_part: Opsional. Berupa STRING yang menentukan satuan waktu untuk hasil pengembalian. Jika parameter ini tidak ditentukan, satuan default adalah hari.
Nilai-nilai berikut didukung:
Satuan waktu
Nilai
Tahun
yearatauyyyyBulan
month,mon, ataummMinggu
week: Minggu dimulai pada hari Senin. Ini setara denganweek(monday).week(weekday): Minggu dimulai pada hari yang ditentukan(weekday).Nilai yang valid: SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, dan SATURDAY.
Minggu ISO
isoweekmenggunakan batas minggu yang didefinisikan dalam ISO 8601. Minggu ISO dimulai pada hari Senin.Hari
dayatauddJam
houratauhhMenit
miKedua,
ssMilidetik
ff3Mikrodetik
ff6
Nilai Kembali
Mengembalikan nilai BIGINT atau INT. Aturan berikut berlaku:
Jika date_part ditentukan, nilai BIGINT dikembalikan. Jika date_part tidak ditentukan, nilai INT dikembalikan.
Jika end_date atau start_date bukan bertipe STRING, DATE, DATETIME, TIMESTAMP, atau TIMESTAMP_NTZ, kesalahan akan dikembalikan.
Jika end_date lebih awal daripada start_date, nilai negatif dikembalikan.
Jika end_date, start_date, atau date_part bernilai NULL, NULL dikembalikan.
Metode perhitungan fungsi berbeda tergantung pada apakah mode kompatibilitas BigQuery diaktifkan, jika parameter input bukan bertipe TIMESTAMP_NTZ:
Secara default (ketika mode kompatibilitas BigQuery dinonaktifkan), fungsi pertama-tama memotong nilai ke satuan yang ditentukan oleh date_part, lalu menghitung selisihnya. Misalnya, selisih antara DATE'25-01-01' dan
DATE'24-12-31'adalah 1 tahun atau 1 bulan.Ketika Anda menjalankan perintah
SET odps.sql.bigquery.compatible=true;untuk mengaktifkan mode kompatibilitas BigQuery:Jika date_part adalah year, month, week, atau isoweek, fungsi pertama-tama memotong nilai ke satuan yang ditentukan oleh date_part, lalu menghitung selisihnya. Misalnya, selisih antara TIMESTAMP'25-01-01' dan
TIMESTAMP'24-12-31'adalah 1 tahun atau 1 bulan.Jika date_part adalah day, hour, minute, second, millisecond, atau microsecond, fungsi pertama-tama menghitung selisih total, lalu mengonversi hasilnya ke satuan yang ditentukan oleh date_part. Misalnya, selisih antara TIMESTAMP'25-01-01 00:00:00' dan
TIMESTAMP'24-12-31 23:59:59'adalah 0 hari atau 0 jam.
Contoh
Contoh 1: Contoh dasar
Menghitung selisih dalam hari.
-- Mengembalikan 1. SELECT DATEDIFF(DATE '2025-03-02', DATE '2025-03-01', 'dd');Menghitung selisih dalam jam.
-- Mengembalikan 4. SELECT DATEDIFF(CAST('2023-10-26 14:00:00' AS DATETIME), CAST('2023-10-26 10:00:00' AS DATETIME), 'hh');Menghitung selisih dalam mikrodetik di mana end_date lebih awal daripada start_date.
-- Mengembalikan -86400000000. SELECT DATEDIFF(DATE '2025-03-01', DATE '2025-03-02', 'ff6');Menghitung selisih dalam minggu, dengan minggu dimulai pada hari Jumat.
-- Mengembalikan 13. SELECT DATEDIFF(DATETIME '2025-07-01 00:00:00', DATETIME '2025-03-28 01:30:09', 'week(friday)');Menghitung selisih dalam minggu ISO.
-- Mengembalikan 20. SELECT DATEDIFF(TIMESTAMP_NTZ '2025-06-07 10:30:00.123', TIMESTAMP_NTZ '2025-01-15 00:30:45.123456', 'isoweek');
Contoh 2: Perbandingan sebelum dan sesudah mengaktifkan mode kompatibilitas BigQuery
-- Mengembalikan 5. Dalam mode default, nilai dipotong sebelum selisih dihitung.
SELECT DATEDIFF(CAST('2024-11-01 10:05:05' AS TIMESTAMP), CAST('2024-11-01 10:00:10' AS TIMESTAMP), 'mi' ) AS diff_in_minute1;
-- Mengembalikan 4. Dalam mode kompatibilitas BigQuery, selisih dihitung terlebih dahulu lalu dikonversi ke satuan yang ditentukan.
SET odps.sql.bigquery.compatible=true;
SELECT DATEDIFF(CAST('2024-11-01 10:05:05' AS TIMESTAMP), CAST('2024-11-01 10:00:10' AS TIMESTAMP), 'mi' ) AS diff_in_minute1;Contoh 3: Parameter input bertipe STRING
Jika end_date dan start_date bertipe STRING, perilaku fungsi bergantung pada format string tersebut dan edisi tipe data MaxCompute.
Jika string input berada dalam format
DATE(yyyy-mm-dd), seperti2025-07-21, parameter date_part tidak didukung baik pada edisi tipe data MaxCompute 1.0 maupun 2.0.Pada edisi tipe data MaxCompute 1.0:
-- Tetapkan edisi tipe data ke V1.0. SET odps.sql.type.system.odps2=false; SET odps.sql.hive.compatible=false; -- Contoh salah: Parameter input bertipe STRING dalam format yyyy-mm-dd, dan parameter date_part ditentukan. NULL dikembalikan. SELECT DATEDIFF('2025-07-01', '2025-06-28','day'); -- Contoh benar: Parameter input bertipe STRING dalam format yyyy-mm-dd, dan parameter date_part tidak ditentukan. date_part default adalah hari. SELECT DATEDIFF('2025-07-01', '2025-06-28'); -- Hasil berikut dikembalikan. +------+ | _c0 | +------+ | 3 | +------+Pada edisi tipe data MaxCompute 2.0:
-- Tetapkan edisi tipe data ke V2.0. SET odps.sql.type.system.odps2=true; -- Contoh salah: Parameter input bertipe STRING dalam format yyyy-mm-dd, dan parameter date_part ditentukan. Kesalahan dikembalikan. SELECT DATEDIFF('2025-07-01', '2025-06-28','day'); -- Contoh benar: Parameter input bertipe STRING dalam format yyyy-mm-dd, dan parameter date_part tidak ditentukan. date_part default adalah hari. SELECT DATEDIFF('2025-07-01', '2025-06-28'); -- Hasil berikut dikembalikan. +------+ | _c0 | +------+ | 3 | +------+
Jika string input berada dalam format
DATETIME(yyyy-mm-dd hh:mi:ss), seperti2025-07-21 00:00:00:Pada edisi tipe data MaxCompute 1.0, nilai dikonversi secara implisit ke tipe
DATETIMEuntuk perhitungan. Parameter date_part didukung:-- Tetapkan edisi tipe data ke V1.0. SET odps.sql.type.system.odps2=false; SET odps.sql.hive.compatible=false; -- Contoh benar: Parameter input bertipe STRING dan sesuai dengan format DATETIME. Parameter date_part didukung. SELECT DATEDIFF('2025-07-01 00:21:00', '2025-03-28 01:30:09', 'hour'); -- Hasil berikut dikembalikan. +------------+ | _c0 | +------------+ | 2279 | +------------+Pada edisi tipe data MaxCompute 2.0, konversi implisit dan parameter date_part tidak didukung. Secara default, selisih dihitung dan dinyatakan dalam hari:
-- Tetapkan edisi tipe data ke V2.0. SET odps.sql.type.system.odps2=true; SET odps.sql.hive.compatible=false; -- Contoh salah: Parameter input bertipe STRING dan sesuai dengan format DATETIME, tetapi parameter date_part ditentukan. Kesalahan dikembalikan. SELECT DATEDIFF('2025-07-01 00:21:00', '2025-03-28 01:30:09', 'hour'); -- Contoh benar: Parameter input bertipe STRING, dan parameter date_part tidak ditentukan. Selisih dihitung dalam hari secara default. SELECT DATEDIFF('2025-07-01 00:21:00', '2025-03-28 01:30:09'); -- Hasil berikut dikembalikan. +------------+ | _c0 | +------------+ | 95 | +------------+
Fungsi terkait
DATEDIFF adalah fungsi tanggal. Untuk informasi selengkapnya tentang fungsi untuk perhitungan dan konversi tanggal, lihat Fungsi tanggal.