datetimeoffset (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Menentukan tanggal yang dikombinasikan dengan waktu sehari berdasarkan jam 24 jam seperti datetime2, dan menambahkan kesadaran zona waktu berdasarkan UTC (Universal Time Coordinate atau Greenwich Mean Time).

deskripsi datetimeoffset

Properti Nilai
Sintaks datetimeoffset [ (presisi detik pecahan) ]
Penggunaan DECLARE @MyDatetimeoffset datetimeoffset(7)

CREATE TABLE Table1 ( Column1 datetimeoffset(7) )
Format literal string default (digunakan untuk klien tingkat bawah) YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+|-}hh:mm]

Untuk informasi selengkapnya, lihat bagian "Kompatibilitas Mundur untuk Klien Tingkat Bawah" berikut ini.
Rentang tanggal 0001-01-01 hingga 9999-12-31

Januari 1, 1 CE hingga Desember 31, 9999 CE
Rentang waktu 00:00:00 hingga 23:59:59.99999999
Rentang offset zona waktu -14:00 sampai +14:00
Rentang elemen YYYY adalah empat digit, mulai dari 0001 hingga 9999, yang mewakili setahun.

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 tujuh digit, mulai dari 0 hingga 9999999, yang mewakili detik pecahan.

hh adalah dua digit yang berkisar dari -14 hingga +14.

mm adalah dua digit yang berkisar antara 00 hingga 59.
Panjang karakter Minimal 26 posisi (YYYY-MM-DD hh:mm:ss {+|-}hh:mm) hingga 34 maksimum (YYYY-MM-DD hh:mm:ss.nnnnnnn {+|-}hh:mm)
Presisi, skala Lihat tabel di bawah.
Ukuran penyimpanan 10 byte, tetap adalah default dengan default presisi kedua pecahan 100ns.
Akurasi 100 nanodetik
Nilai default 1900-01-01 00:00:00 00:00
Calendar Gregorian
Presisi kedua pecahan yang ditentukan pengguna Ya
Sadar dan pelestarian offset zona waktu Ya
Kesadaran musim panas No
Skala yang ditentukan Hasil (presisi, skala) Panjang kolom (byte) Presisi detik pecahan
datetimeoffset (34,7) 10 7
datetimeoffset(0) (26,0) 8 0-2
datetimeoffset(1) (28,1) 8 0-2
datetimeoffset(2) (29,2) 8 0-2
datetimeoffset(3) (30,3) 9 3-4
datetimeoffset(4) (31,4) 9 3-4
datetimeoffset(5) (32,5) 10 5-7
datetimeoffset(6) (33,6) 10 5-7
datetimeoffset(7) (34,7) 10 5-7

Format literal string yang didukung untuk datetimeoffset

Tabel berikut mencantumkan format literal string ISO 8601 yang didukung untuk datetimeoffset. Untuk informasi tentang format alfabet, numerik, tidak dipisahkan , dan waktu untuk bagian tanggal dan waktu datetimeoffset, lihat tanggal (Transact-SQL) dan waktu (Transact-SQL).

ISO 8601 Deskripsi
YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm] Kedua format ini tidak terpengaruh oleh PENGATURAN lokal sesi SET LANGUAGE dan SET DATEFORMAT. Spasi tidak diperbolehkan antara bagian datetimeoffset dan datetime .
YYYY-MM-DDThh:mm:ss[.nnnnnnn]Z (UTC) Format menurut definisi ISO ini menunjukkan bagian tanggalwaktu harus dinyatakan dalam Waktu Universal Terkoordinasi (UTC). Misalnya, 1999-12-12 12:30:30.12345 -07:00 harus diwakili sebagai 1999-12-12 19:30:30.12345Z.

Offset zona waktu

Offset zona waktu menentukan offset zona dari UTC untuk nilai waktu atau tanggalwaktu . Offset zona waktu dapat direpresentasikan sebagai [+|-] hh:mm:

  • hh adalah dua digit yang berkisar antara 00 hingga 14 dan mewakili jumlah jam dalam offset zona waktu.
  • mm adalah dua digit, mulai dari 00 hingga 59, yang mewakili jumlah menit tambahan dalam offset zona waktu.
  • + (plus) atau - (minus) adalah tanda wajib untuk offset zona waktu. Ini menunjukkan apakah offset zona waktu ditambahkan atau dikurangi dari waktu UTC untuk mendapatkan waktu lokal. Rentang offset zona waktu yang valid adalah dari -14:00 hingga +14:00.

Rentang offset zona waktu mengikuti standar XML W3C untuk definisi skema XSD dan sedikit berbeda dari definisi standar SQL 2003, 12:59 hingga +14:00.

Presisi detik pecahan parameter jenis opsional menentukan jumlah digit untuk bagian pecahan detik. Nilai ini dapat berupa bilangan bulat dengan 0 hingga 7 (100 nanodetik). Presisi detik pecahan default adalah 100n (tujuh digit untuk bagian pecahan detik).

Data disimpan dalam database dan diproses, dibandingkan, diurutkan, dan diindeks di server seperti di UTC. Offset zona waktu akan dipertahankan dalam database untuk pengambilan.

Offset zona waktu yang diberikan akan diasumsikan sebagai daylight saving time (DST) sadar dan disesuaikan untuk tanggalwaktu tertentu yang berada dalam periode DST.

Untuk jenis datetimeoffset, nilai tanggalwaktu UTC dan lokal (ke offset zona waktu persisten atau dikonversi) akan divalidasi selama operasi sisipkan, perbarui, aritmatika, konversi, atau tetapkan. Deteksi nilai tanggalwaktu UTC atau lokal yang tidak valid (ke offset zona waktu persisten atau dikonversi) akan memunculkan kesalahan nilai yang tidak valid. Misalnya, 9999-12-31 10:10:00 berlaku di UTC, tetapi luapan waktu lokal ke offset zona waktu +13:50.

Untuk mengonversi tanggal ke nilai datetimeoffset yang sesuai di zona waktu target, lihat AT TIME ZONE (Transact-SQL).

Kepatuhan ANSI dan ISO 8601

Bagian Kepatuhan ANSI dan ISO 8601 dari topik tanggal dan waktu berlaku untuk datetimeoffset.

Kompatibilitas mundur untuk klien tingkat bawah

Beberapa klien tingkat bawah tidak mendukung jenis data waktu, tanggal, tanggalwaktu2, dan datetimeoffset. Tabel berikut menunjukkan pemetaan jenis antara instans tingkat atas SQL Server dan klien tingkat bawah.

Tipe data SQL Server Format literal string default diteruskan ke klien tingkat bawah ODBC tingkat bawah OLEDB tingkat bawah JDBC tingkat bawah SQLCLIENT tingkat bawah
time hh:mm:ss[.nnnnnnn] SQL_WVARCHAR atau SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String atau SqString
date YYYY-MM-DD SQL_WVARCHAR atau SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String atau SqString
datetime2 YYYY-MM-DD hh:mm:ss[.nnnnnnn] SQL_WVARCHAR atau SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String atau SqString
datetimeoffset YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm SQL_WVARCHAR atau SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String atau SqString

Mengonversi data tanggal dan waktu

Saat Anda mengonversi ke jenis data tanggal dan waktu, SQL Server menolak semua nilai yang tidak dapat dikenali sebagai tanggal atau waktu. Untuk informasi tentang menggunakan fungsi CAST dan CONVERT dengan data tanggal dan waktu, lihat CAST dan CONVERT (Transact-SQL)

Mengonversi jenis data datetimeoffset ke jenis tanggal dan waktu lainnya

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

Saat mengonversi ke tanggal, tahun, bulan, dan hari disalin. Kode berikut menunjukkan hasil konversi nilai menjadi datetimeoffset(4)date nilai.

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10 +01:00';
DECLARE @date DATE = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset ', @date AS 'date';

Berikut adalah hasil yang ditetapkan.

@datetimeoffset                 date  
------------------------------ ----------  
2025-12-10 12:32:10.0000 +01:0 2025-12-10  

Jika konversi adalah ke waktu(n), detik jam, menit, detik, dan pecahan disalin. Nilai zona waktu dipotong. Ketika presisi nilai datetimeoffset(n) lebih besar dari presisi nilai waktu(n), nilai dibulatkan ke atas. Kode berikut menunjukkan hasil konversi nilai menjadi datetimeoffset(4)time(3) nilai.

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @time TIME(3) = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time';

Berikut adalah hasil yang ditetapkan.

@datetimeoffset                 time  
------------------------------- ------------  
2025-12-10 12:32:10.1237 +01:00 12:32:10.124  

Saat mengonversi kedatetime, nilai tanggal dan waktu disalin, dan zona waktu dipotong. Ketika presisi pecahan dari nilai datetimeoffset(n) lebih besar dari tiga digit, nilai dipotong. Kode berikut menunjukkan hasil konversi nilai menjadi datetimeoffset(4)datetime nilai.

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @datetime DATETIME = @datetimeoffset;

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

Berikut adalah hasil yang ditetapkan.

@datetimeoffset                datetime  
------------------------------ -----------------------  
2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123  

Untuk konversi ke smalldatetime, tanggal dan jam disalin. Menit dibulatkan ke atas sehubungan dengan nilai detik dan detik diatur ke 0. Kode berikut menunjukkan hasil konversi nilai menjadi datetimeoffset(3)smalldatetime nilai.

DECLARE @datetimeoffset DATETIMEOFFSET(3) = '1912-10-25 12:24:32 +10:0';
DECLARE @smalldatetime SMALLDATETIME = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime';

Berikut adalah hasil yang ditetapkan.

@datetimeoffset                @smalldatetime  
------------------------------ -----------------------  
1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00  

Jika konversi ke datetime2(n), tanggal dan waktu disalin ke nilai datetime2 , dan zona waktu dipotong. Ketika presisi nilai datetime2(n) lebih besar dari presisi nilai datetimeoffset(n), detik pecahan dipotong agar pas. Kode berikut menunjukkan hasil konversi nilai menjadi datetimeoffset(4)datetime2(3) nilai.

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1912-10-25 12:24:32.1277 +10:0';
DECLARE @datetime2 DATETIME2(3) = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @datetime2 AS '@datetime2';

Berikut adalah hasil yang ditetapkan.

@datetimeoffset                    @datetime2  
---------------------------------- ----------------------  
1912-10-25 12:24:32.1277 +10:00    1912-10-25 12:24:32.12  

Mengonversi literal string menjadi datetimeoffset

Konversi dari literal string ke jenis tanggal dan waktu diizinkan jika semua bagian string dalam format yang valid. Jika tidak, kesalahan runtime muncul. Konversi implisit atau konversi eksplisit yang tidak menentukan gaya, dari jenis tanggal dan waktu hingga literal string akan berada dalam format default sesi saat ini. Tabel berikut ini memperlihatkan aturan untuk mengonversi string literal ke jenis data datetimeoffset .

String input literal datetimeoffset(n)
TANGGAL ODBC Literal string ODBC dipetakan ke jenis data tanggalwaktu . Setiap operasi penugasan dari LITERAL ODBC DATETIME menjadi jenis datetimeoffset akan menyebabkan konversi implisit antara tanggalwaktu dan jenis ini seperti yang didefinisikan oleh aturan konversi.
WAKTU ODBC Lihat aturan TANGGAL ODBC sebelumnya.
TANGGALWAKTU ODBC Lihat aturan TANGGAL ODBC sebelumnya.
HANYA TANGGAL Bagian TIME default ke 00:00:00. TIMEZONE default ke +00:00.
Hanya WAKTU Bagian DATE default ke 1900-1-1. TIMEZONE akan default ke +00:00.
TimeZONE saja Nilai default disediakan
TANGGAL + WAKTU TIMEZONE default ke +00:00.
DATE + TIMEZONE Tidak diizinkan
TIME + TIMEZONE Bagian DATE default ke 1900-1-1.
TANGGAL + WAKTU + ZONA WAKTU Trivial

Contoh

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

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

Berikut adalah hasil yang ditetapkan.

Jenis data Hasil
Waktu 12:35:29. 1234567
Tanggal 2007-05-08
Waktu smalldatetime 2007-05-08 12:35:00
Tanggalwaktu 2007-05-08 12:35:29.123
datetime2 2007-05-08 12:35:29. 1234567
Datetimeoffset 2007-05-08 12:35:29.1234567 +12:15

Baca juga

CAST dan CONVERT (Transact-SQL)
PADA ZONA WAKTU (T-SQL)