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 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 dari 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. 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:50zona 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

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