All Products
Search
Document Center

MaxCompute:DATEDIFF

Last Updated:Nov 13, 2025

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.

    • Jika string input berada dalam format DATE (yyyy-mm-dd), seperti 2025-07-21, parameter date_part tidak didukung baik pada edisi tipe data MaxCompute 1.0 maupun 2.0.

    • Jika string input berada dalam format DATETIME (yyyy-mm-dd hh:mi:ss), seperti 2025-07-21 00:00:00:

      • Pada edisi tipe data MaxCompute 1.0, nilai tersebut dikonversi secara implisit ke tipe DATETIME. Parameter date_part didukung.

      • Pada edisi tipe data MaxCompute 2.0, konversi implisit dan parameter date_part tidak didukung.

  • 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

    year atau yyyy

    Bulan

    month, mon, atau mm

    Minggu

    • week: Minggu dimulai pada hari Senin. Ini setara dengan week(monday).

    • week(weekday): Minggu dimulai pada hari yang ditentukan (weekday).

      Nilai yang valid: SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, dan SATURDAY.

    Minggu ISO

    isoweek menggunakan batas minggu yang didefinisikan dalam ISO 8601. Minggu ISO dimulai pada hari Senin.

    Hari

    day atau dd

    Jam

    hour atau hh

    Menit

    mi

    Kedua,

    ss

    Milidetik

    ff3

    Mikrodetik

    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), seperti 2025-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), seperti 2025-07-21 00:00:00:

    • Pada edisi tipe data MaxCompute 1.0, nilai dikonversi secara implisit ke tipe DATETIME untuk 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.