datetimeoffset (Transact-SQL)
Berlaku untuk: Titik akhir analitik SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System (PDW) SQL di Microsoft Fabric Warehouse di Microsoft Fabric
Menentukan tanggal yang dikombinasikan dengan waktu sehari berdasarkan jam 24 jam seperti datetime2, dan menambahkan kesadaran zona waktu berdasarkan Waktu Universal Terkoordinasi (UTC).
deskripsi datetimeoffset
Properti | Nilai |
---|---|
Sintaksis | 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 yang mengikutinya. |
Rentang tanggal | 0001-01-01 melalui 9999-12-31 Januari 1, 1 CE hingga Desember 31, 9999 CE |
Rentang waktu | 00:00:00 melalui 23:59:59.9999999 |
Rentang offset zona waktu | -14:00 melalui +14:00 |
Rentang elemen | yyyy adalah empat digit, mulai dari 0001 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 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 dari 00 hingga 59 . |
Panjang karakter | Minimal 26 posisi (yyyy-MM-dd HH:mm:ss {+|-}hh:mm) hingga 34 maksimum (yyyyy-MM-dd HH:mm:ss.nnnnnnn {+|-}hh:mm) |
Presisi, skala | Lihat tabel berikut. |
Ukuran penyimpanan | 10 byte, tetap adalah default dengan default presisi kedua pecahan 100-ns. |
Akurasi | 100 nanodetik |
Nilai default | 1900-01-01 00:00:00 00:00 |
Kalender | 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 hingga 2 |
datetimeoffset(1) | (28, 1) | 8 | 0 hingga 2 |
datetimeoffset(2) | (29, 2) | 8 | 0 hingga 2 |
datetimeoffset(3) | (30, 3) | 9 | 3 hingga 4 |
datetimeoffset(4) | (31, 4) | 9 | 3 hingga 4 |
datetimeoffset(5) | (32, 5) | 10 | 5 hingga 7 |
datetimeoffset(6) | (33, 6) | 10 | 5 hingga 7 |
datetimeoffset(7) | (34, 7) | 10 | 5 hingga 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 (T-SQL) dan waktu (Transact-SQL).
ISO 8601 | Deskripsi |
---|---|
yyyy-MM-ddTHH:mm:ss[.nnnnnnn][{+|-}hh:mm] | Kedua format ini tidak terpengaruh oleh SET LANGUAGE pengaturan lokal sesi 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 direpresentasikan sebagai 1999-12-12 19:30:30.12345Z . |
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 | Output |
---|---|
time |
12:35:29.1234567 |
date |
2007-05-08 |
smalldatetime |
2007-05-08 12:35:00 |
datetime |
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 |
datetimeoffset IS08601 |
2007-05-08 12:35:29.1234567 +12:15 |
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 dari00
hingga14
dan mewakili jumlah jam dalam offset zona waktu.mm
adalah dua digit, mulai dari00
hingga59
, yang mewakili jumlah menit tambahan dalam offset zona waktu.+
(plus) atau-
(minus) adalah tanda wajib untuk offset zona waktu. Tanda 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
ke+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 100 ns (tujuh digit untuk bagian pecahan detik).
Data disimpan dalam database dan diproses, dibandingkan, diurutkan, dan diindeks di server seperti di UTC. Offset zona waktu dipertahankan dalam database untuk pengambilan.
Offset zona waktu yang diberikan diasumsikan sebagai waktu musim panas (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) divalidasi selama operasi sisipkan, perbarui, aritmetika, konversi, atau tetapkan. Deteksi nilai tanggalwaktu UTC atau lokal yang tidak valid (ke offset zona waktu persisten atau dikonversi) menimbulkan kesalahan nilai yang tidak valid. Misalnya, 9999-12-31 10:10:00
valid dalam UTC, tetapi meluap di waktu lokal ke offset +13:50
zona waktu .
Sintaks konversi zona waktu
SQL Server 2016 (13.x) memperkenalkan AT TIME ZONE
sintaks untuk memfasilitasi konversi zona waktu universal yang sadar akan penghematan siang hari. Sintaks ini sangat berguna saat mengonversi data tanpa offset zona waktu, ke data dengan offset zona waktu. Untuk mengonversi ke nilai datetimeoffset yang sesuai di zona waktu target, lihat ZONA WAKTU.
Kepatuhan ANSI dan ISO 8601
Bagian kepatuhan ANSI dan ISO 8601 dari artikel 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 |
Dukungan Microsoft Fabric
Di Microsoft Fabric, saat ini Anda tidak dapat membuat kolom dengan jenis data datetimeoffset , tetapi Anda dapat menggunakan datetimeoffset untuk mengonversi data dengan fungsi AT TIME ZONE (Transact-SQL), misalnya:
SELECT
CAST(CAST('2024-07-03 00:00:00' AS DATETIMEOFFSET) AT TIME ZONE 'Pacific Standard Time' AS datetime2) AS PST
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 CAST
fungsi dan CONVERT
dengan data tanggal dan waktu, lihat CAST dan CONVERT.
Mengonversi ke jenis data datetimeoffset
Bagian ini menyediakan contoh memperbarui data dari jenis data tanpa offset ke kolom jenis data datetimeoffset baru.
Pertama, verifikasi nama zona waktu dari tampilan katalog sistem sys.time_zone_info .
SELECT * FROM sys.time_zone_info WHERE name = 'Pacific Standard Time';
Contoh berikut menggunakan sintaks AT TIME ZONE dua kali. Kode sampel membuat tabel dbo.Audit
, menambahkan data yang mencakup beberapa perubahan waktu penghematan siang hari, dan menambahkan kolom datetimeoffset baru. Kami berasumsi bahwa AuditCreated
kolom adalah jenis data *datetime2 tanpa offset, dan ditulis menggunakan zona waktu UTC.
UPDATE
Dalam pernyataan, AT TIME ZONE
sintaks pertama menambahkan offset zona waktu UTC ke data kolom yang adaAuditCreated
, lalu mengonversi data dari UTC ke Pacific Standard Time
, dengan benar menyesuaikan data historis untuk setiap rentang waktu penghematan siang hari sebelumnya dalam Amerika Serikat.
CREATE TABLE dbo.Audit (AuditCreated DATETIME2(0) NOT NULL);
GO
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('1/1/2024 12:00:00');
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('5/1/2024 12:00:00');
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('12/1/2024 12:00:00');
GO
ALTER TABLE dbo.Audit
ADD AuditCreatedOffset DATETIMEOFFSET(0) NULL;
GO
DECLARE @TimeZone VARCHAR(50);
SELECT @TimeZone = [name]
FROM sys.time_zone_info
WHERE [name] = 'Pacific Standard Time';
UPDATE dbo.Audit
SET AuditCreatedOffset = AuditCreated
AT TIME ZONE 'UTC' AT TIME ZONE @TimeZone
WHERE AuditCreatedOffset IS NULL;
GO
SELECT *
FROM dbo.Audit;
Berikut adalah hasil yang ditetapkan.
AuditCreated AuditCreatedOffset
------------------- --------------------------
2024-01-01 12:00:00 2024-01-01 04:00:00 -08:00
2024-05-01 12:00:00 2024-05-01 05:00:00 -07:00
2024-12-01 12:00:00 2024-12-01 04:00:00 -08:00
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 Anda mengonversi ke tanggal, tahun, bulan, dan hari disalin. Kode berikut menunjukkan hasil konversi nilai datetimeoffset(4) menjadi nilai tanggal .
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 datetimeoffset(4) menjadi nilai waktu(3).
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 Anda mengonversi ke datetime, 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 datetimeoffset(4) menjadi nilai tanggalwaktu.
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 datetimeoffset(3) menjadi nilai smalldatetime .
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 datetimeoffset(4) menjadi nilai datetime2(3).
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 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) |
---|---|
ODBC DATE |
Literal string ODBC dipetakan ke jenis data tanggalwaktu . Setiap operasi penugasan dari ODBC DATETIME literal ke dalam jenis datetimeoffset menyebabkan konversi implisit antara tanggalwaktu dan jenis ini, seperti yang didefinisikan oleh aturan konversi. |
ODBC TIME |
Lihat aturan sebelumnya ODBC DATE |
ODBC DATETIME |
Lihat aturan sebelumnya ODBC DATE |
DATE hanya |
Bagian TIME default ke 00:00:00 . Default TIMEZONE ke +00:00 |
TIME hanya |
Bagian DATE default ke 1900-1-1 . Default TIMEZONE ke +00:00 |
TIMEZONE hanya |
Nilai default disediakan |
DATE + TIME |
Default TIMEZONE ke +00:00 |
DATE + TIMEZONE |
Tidak diizinkan |
TIME + TIMEZONE |
Bagian DATE default ke 1900-1-1 |
DATE + TIME + TIMEZONE |
Trivial |