Bagikan melalui


datetime (Transact-SQL)

Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Menentukan tanggal yang dikombinasikan dengan waktu hari dengan detik pecahan yang didasarkan pada jam 24 jam.

Hindari menggunakan tanggalwaktu untuk pekerjaan baru. Sebagai gantinya , gunakan jenis data time, date, datetime2, dan datetimeoffset . Jenis-jenis ini selaras dengan Standar SQL, dan lebih portabel. time, datetime2 , dan datetimeoffset memberikan presisi lebih detik. datetimeoffset menyediakan dukungan zona waktu untuk aplikasi yang disebarkan secara global.

Deskripsi

Properti Nilai
Sintaksis DATETIME
Penggunaan DECLARE @MyDatetime DATETIME;
CREATE TABLE Table1 (Column1 DATETIME);
Format literal string default (digunakan untuk klien tingkat bawah) Tidak berlaku
Rentang tanggal 1753-01-01 (1 Januari 1753) hingga 9999-12-31 (31 Desember 9999)
Rentang waktu 00:00:00 hingga 23:59:59.997
Rentang offset zona waktu Tidak
Rentang elemen yyyy adalah empat digit dari 1753 hingga 9999 yang mewakili satu tahun.

MM adalah dua digit, mulai dari 01 hingga 12, yang mewakili sebulan dalam tahun yang ditentukan.

dd adalah dua digit, mulai dari 01 hingga 31 tergantung pada bulan, yang mewakili hari dari bulan yang ditentukan.

HH adalah dua digit, mulai dari 00 hingga 23, yang mewakili jam.

mm adalah dua digit, mulai dari 00 hingga 59, yang mewakili menit.

ss adalah dua digit, mulai dari 00 hingga 59, yang mewakili yang kedua.

n* adalah nol hingga tiga digit, mulai dari 0 hingga 999, yang mewakili detik pecahan.
Panjang karakter 19 posisi minimal hingga 23 maksimum
Ukuran penyimpanan 8 byte
Akurasi Dibulatkan ke kenaikan , .000, .003atau .007 detik
Nilai default 1900-01-01 00:00:00
Kalender Gregorian (termasuk rentang tahun lengkap)
Presisi kedua pecahan yang ditentukan pengguna No
Sadar dan pelestarian offset zona waktu No
Kesadaran musim panas No

Format literal string yang didukung untuk tanggalwaktu

Tabel berikut mencantumkan format literal string yang didukung untuk tanggalwaktu. Kecuali untuk ODBC, literal string tanggalwaktu berada dalam tanda kutip tunggal ('), misalnya, 'string_literaL'. Jika lingkungan tidak us_english, string harfiah harus dalam format N'string_literaL'Unicode .

Format numerik

Anda dapat menentukan data tanggal dengan bulan numerik yang ditentukan. Misalnya, 5/20/97 mewakili hari kedua puluh Mei 1997. Saat Anda menggunakan format tanggal numerik, tentukan bulan, hari, dan tahun dalam string yang menggunakan tanda garis miring (/), tanda hubung (-), atau titik (.) sebagai pemisah. String ini harus muncul dalam formulir berikut:

<number separator number separator number [time] [time]>

Saat bahasa diatur ke us_english, urutan default untuk tanggal adalah mdy (bulan, hari, tahun). Anda dapat mengubah urutan tanggal dengan menggunakan pernyataan SET DATEFORMAT .

Pengaturan untuk SET DATEFORMAT menentukan bagaimana nilai tanggal ditafsirkan. Jika urutan tidak cocok dengan pengaturan, nilai tidak ditafsirkan sebagai tanggal. Tanggal di luar urutan mungkin disalahartikan sebagai di luar rentang atau dengan nilai yang salah. Misalnya, 12/10/08 dapat ditafsirkan sebagai salah satu dari enam tanggal, tergantung pada pengaturan.DATEFORMAT Empat bagian tahun ditafsirkan sebagai tahun.

Format tanggal Pesanan
[0]4/15/[19]96 mdy
[0]4-15-[19]96 mdy
[0]4.15.[19]96 mdy
[0]4/[19]96/15 myd
15/[0]4/[19]96 dmy
15/[19]96/[0]4 dym
[19]96/15/[0]4 ydm
[19]96/[0]4/15 ymd
Format waktu
14:30
14:30[:20:997]
14:30[:20.9]
4am
4 PM

Format alfabet

Anda dapat menentukan data tanggal dengan bulan yang ditentukan sebagai nama bulan lengkap. Misalnya, April, atau singkatan bulan dari Apr, yang ditentukan dalam bahasa saat ini. Koma bersifat opsional dan kapitalisasi diabaikan.

Berikut adalah beberapa panduan untuk menggunakan format tanggal alfabet:

  • Sertakan data tanggal dan waktu dalam tanda kutip tunggal ('). Untuk bahasa selain bahasa Inggris, gunakan N''.

  • Karakter yang diapit dalam tanda kurung bersifat opsional.

  • Jika Anda hanya menentukan dua digit terakhir dalam setahun, nilai yang kurang dari dua digit terakhir dari nilai opsi konfigurasi cutoff dua digit tahun berada di abad yang sama dengan tahun cutoff. Nilai yang lebih besar dari atau sama dengan nilai opsi ini adalah pada abad yang datang sebelum tahun cutoff. Misalnya, jika cutoff dua digit tahun adalah 2050 (default), 25 ditafsirkan sebagai 2025 dan 50 ditafsirkan sebagai 1950. Untuk menghindari ambiguitas, gunakan tahun empat digit.

  • Jika hari hilang, hari pertama dalam sebulan disediakan.

  • SET DATEFORMAT Pengaturan sesi tidak diterapkan saat Anda menentukan bulan dalam bentuk alfabet.

Alfabetis
Apr[il] [15][,] 1996
Apr[il] 15[,] [19]96
Apr[il] 1996 [15]
[15] Apr[il][,] 1996
15 Apr[il][,][19]96
15 [19]96 apr[il]
[15] 1996 apr[il]
1996 APR[IL] [15]
1996 [15] APR[IL]

Format ISO 8601

Untuk menggunakan format ISO 8601, Anda harus menentukan setiap elemen dalam format, termasuk T, titik dua (:), dan titik (.) yang ditampilkan dalam format.

Tanda kurung menunjukkan bahwa pecahan komponen kedua bersifat opsional. Komponen waktu ditentukan dalam format 24 jam. T menunjukkan awal bagian waktu dari nilai tanggalwaktu.

Keuntungan dalam menggunakan format ISO 8601 adalah bahwa ini adalah standar internasional dengan spesifikasi yang tidak ambigu. Selain itu, format ini tidak terpengaruh oleh SET DATEFORMAT pengaturan atau ATUR BAHASA .

Contoh:

  • 2004-05-23T14:25:10
  • 2004-05-23T14:25:10.487
ISO 8601
yyyy-MM-ddTHH:mm:ss[.mmm]
yyyyMMdd[ HH:mm:ss[.mmm]]

Format yang tidak dipisahkan

Format ini mirip dengan format ISO 8601, kecuali tidak berisi pemisah tanggal.

Tidak dipisahkan
yyyyMMdd HH:mm:ss[.mmm]

Format ODBC

ODBC API mendefinisikan urutan escape untuk mewakili nilai tanggal dan waktu, yang ODBC memanggil data tanda waktu. Format tanda waktu ODBC ini juga didukung oleh definisi bahasa OLE DB (DBGUID-SQL) yang didukung oleh penyedia Microsoft OLE DB untuk SQL Server. Aplikasi yang menggunakan API berbasis ADO, OLE DB, dan ODBC dapat menggunakan format tanda waktu ODBC ini untuk mewakili tanggal dan waktu.

Urutan escape tanda waktu ODBC adalah format: : { <literal_type> '<constant_value>' }

  • <literal_type> menentukan jenis urutan escape. Tanda waktu memiliki tiga <literal_type> penentu:

    • d = hanya tanggal
    • t = hanya waktu
    • ts = tanda waktu (waktu + tanggal)
  • <constant_value> adalah nilai urutan escape. <constant_value> harus mengikuti format ini untuk masing-masing <literal_type>:

    • d: yyyy-MM-dd
    • t: hh:mm:ss[.fff]
    • ts: yyyy-MM-dd HH:mm:ss[.fff]
ODBC
{ ts '1998-05-02 01:23:56.123' }
{ d '1990-10-02' }
{ t '13:33:41' }

Pembulatan presisi kedua pecahan tanggalwaktu

nilai tanggalwaktu dibulatkan ke kenaikan .000, , .003atau .007 detik, seperti yang ditunjukkan dalam contoh berikut.

SELECT '01/01/2024 23:59:59.999' AS [User-specified value],
    CAST('01/01/2024 23:59:59.999' AS DATETIME) AS [System stored value]
UNION SELECT '01/01/2024 23:59:59.998', CAST('01/01/2024 23:59:59.998' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.997', CAST('01/01/2024 23:59:59.997' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.996', CAST('01/01/2024 23:59:59.996' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.995', CAST('01/01/2024 23:59:59.995' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.994', CAST('01/01/2024 23:59:59.994' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.993', CAST('01/01/2024 23:59:59.993' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.992', CAST('01/01/2024 23:59:59.992' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.991', CAST('01/01/2024 23:59:59.991' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.990', CAST('01/01/2024 23:59:59.990' AS DATETIME);

Berikut set hasilnya.

Nilai yang ditentukan pengguna Nilai tersimpan sistem
01/01/2024 23:59:59.999 2024-01-02 00:00:00.000
01/01/2024 23:59:59.998
01/01/2024 23:59:59.997
01/01/2024 23:59:59.996
01/01/2024 23:59:59.995
2024-01-01 23:59:59.997
01/01/2024 23:59:59.994
01/01/2024 23:59:59.993
01/01/2024 23:59:59.992
2024-01-01 23:59:59.993
01/01/2024 23:59:59.991
01/01/2024 23:59:59.990
2024-01-01 23:59:59.990

Kepatuhan ANSI dan ISO 8601

datetime tidak sesuai dengan ANSI atau ISO 8601.

Mengonversi data tanggal dan waktu

Saat Anda mengonversi ke jenis data tanggal dan waktu, Mesin Database menolak semua nilai yang tidak dapat dikenali sebagai tanggal atau waktu. Untuk informasi tentang menggunakan CAST fungsi dan CONVERT dengan data tanggal dan waktu, lihat CAST dan CONVERT.

Mengonversi jenis tanggal dan waktu lainnya ke tipe data tanggalwaktu

Bagian ini menjelaskan apa yang terjadi ketika jenis data tanggal dan waktu lainnya dikonversi ke jenis data tanggalwaktu .

Ketika konversi dari tanggal, tahun, bulan, dan hari disalin. Komponen waktu diatur ke 00:00:00.000. Kode berikut menunjukkan hasil konversi nilai menjadi DATE DATETIME nilai.

DECLARE @date DATE = '12-21-16';
DECLARE @datetime DATETIME = @date;

SELECT @datetime AS '@datetime', @date AS '@date';

Berikut set hasilnya.

@datetime                @date
------------------------ -----------
2016-12-21 00:00:00.000  2016-12-21

Contoh sebelumnya menggunakan format tanggal tertentu wilayah (MM-DD-YY).

DECLARE @date DATE = '12-21-16';

Anda harus memperbarui contoh agar sesuai dengan format untuk wilayah Anda.

Anda juga dapat menyelesaikan contoh dengan format tanggal yang sesuai dengan ISO 8601 (yyyy-MM-dd). Contohnya:

DECLARE @date DATE = '2016-12-21';
DECLARE @datetime DATETIME = @date;

SELECT @datetime AS '@datetime', @date AS '@date';

Ketika konversi dari waktu(n), komponen waktu disalin, dan komponen tanggal diatur ke 1900-01-01. Ketika presisi pecahan nilai waktu(n) lebih besar dari tiga digit, nilai dipotong agar pas. Contoh berikut menunjukkan hasil konversi nilai menjadi TIME(4) DATETIME nilai.

DECLARE @time TIME(4) = '12:10:05.1237';
DECLARE @datetime DATETIME = @time;

SELECT @datetime AS '@datetime', @time AS '@time';

Berikut set hasilnya.

@datetime                @time
------------------------ --------------
1900-01-01 12:10:05.123  12:10:05.1237

Ketika konversi berasal dari smalldatetime, jam dan menit disalin. Detik dan detik pecahan diatur ke 0. Kode berikut menunjukkan hasil konversi nilai menjadi SMALLDATETIME DATETIME nilai.

DECLARE @smalldatetime SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime DATETIME = @smalldatetime;

SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';

Berikut set hasilnya.

@datetime                @smalldatetime
------------------------ --------------------
2016-12-01 12:32:00.000  2016-12-01 12:32:00

Ketika konversi berasal dari datetimeoffset(n), komponen tanggal dan waktu disalin. Zona waktu terpotong. Ketika presisi pecahan dari nilai datetimeoffset(n) lebih besar dari tiga digit, nilai dipotong. Contoh berikut menunjukkan hasil konversi nilai menjadi DATETIMEOFFSET(4) DATETIME nilai.

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1968-10-23 12:45:37.1234 +10:0';
DECLARE @datetime DATETIME = @datetimeoffset;

SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';

Berikut set hasilnya.

@datetime                @datetimeoffset
------------------------ -------------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237 +10:0

Saat konversi berasal dari datetime2(n), tanggal dan waktu disalin. Ketika presisi pecahan dari nilai datetime2(n) lebih besar dari tiga digit, nilai dipotong. Contoh berikut menunjukkan hasil konversi nilai menjadi DATETIME2(4) DATETIME nilai.

DECLARE @datetime2 DATETIME2(4) = '1968-10-23 12:45:37.1237';
DECLARE @datetime DATETIME = @datetime2;

SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';

Berikut set hasilnya.

@datetime                @datetime2
------------------------ -------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237

Contoh

Contoh berikut membandingkan hasil transmisi string dengan setiap jenis data tanggal dan waktu .

SELECT CAST('2024-05-08 12:35:29.1234567 +12:15' AS TIME(7)) AS 'time',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
    CAST('2024-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
    CAST('2024-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIME2(7)) AS 'datetime2',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset';

Berikut set hasilnya.

Jenis Data Output
time 12:35:29.1234567
date 2024-05-08
smalldatetime 2024-05-08 12:35:00
datetime 2024-05-08 12:35:29.123
datetime2 2024-05-08 12:35:29.1234567
datetimeoffset 2024-05-08 12:35:29.1234567 +12:15