Bagikan melalui


Konversi nondeterministik string tanggal harfiah menjadi nilai DATE

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

Berhati-hatilah saat mengizinkan konversi string CHARACTER Anda menjadi jenis data DATE. Alasannya adalah bahwa konversi tersebut sering kali tidak mendeterministik.

Anda mengontrol konversi nondeterministik ini dengan memperhitungkan pengaturan SET LANGUAGE dan SET DATEFORMAT.

Contoh SET LANGUAGE: Nama bulan di Polandia

  • SET LANGUAGE Polish;

String karakter bisa menjadi nama sebulan. Tetapi apakah nama dalam bahasa Inggris, atau Polandia, atau Kroasia, atau dalam bahasa lain? Dan, apakah sesi pengguna akan diatur ke BAHASA YANG sesuai dengan benar?

Misalnya, pertimbangkan kata listopad, yang merupakan nama sebulan. Tetapi bulan yang tergantung pada bahasa yang diyakini sistem SQL sedang digunakan:

  • Jika Polandia, maka listopad diterjemahkan ke bulan 11 (November dalam bahasa Inggris).
  • Jika bahasa Kroasia, maka listopad diterjemahkan menjadi bulan 10 (Oktober dalam bahasa Inggris).

Contoh kode SET LANGUAGE

--SELECT alias FROM sys.syslanguages ORDER BY alias;

DECLARE @yourInputDate  NVARCHAR(32) = '28 listopad 2018';

SET LANGUAGE Polish;
SELECT CONVERT(DATE, @yourInputDate) AS [SL_Polish];

SET LANGUAGE Croatian;
SELECT CONVERT(DATE, @yourInputDate) AS [SL_Croatian];

SET LANGUAGE English;


/***  Actual output:  For the two months, note the 11 versus the 10.
SL_Polish
2018-11-28

SL_Croatian
2018-10-28
***/

Setel contoh DATEFORMAT

  • SET DATEFORMAT dmy;

Format dmy sebelumnya mengatakan bahwa contoh string tanggal '01-03-2018' akan ditafsirkan berarti hari pertama Maret pada tahun 2018.

Jika sebaliknya mdy ditentukan, maka string '01-03-2018' yang sama berarti hari ketiga Januari pada 2018.

Dan jika ymd ditentukan, tidak ada jaminan tentang apa outputnya. Nilai numerik '2018' terlalu besar untuk menjadi hari.

Negara/wilayah tertentu

Di Jepang dan Tiongkok, DATEFORMAT dari ymd digunakan. Bagian format berada dalam urutan unit terbesar yang masuk akal hingga terkecil. Jadi, format ini mengurutkan dengan baik. Format ini dianggap sebagai format internasional . Ini internasional karena empat digit tahun ini tidak ambigu, dan tidak ada negara/wilayah di Bumi yang menggunakan format arkea ydm.

Di negara/wilayah lain seperti Jerman dan Prancis, DATEFORMAT adalah dmy, yang berarti 'dd-mm-yyyy'. Format dmy tidak diurutkan dengan baik, tetapi merupakan urutan yang masuk akal dari unit terkecil ke terbesar.

Amerika Serikat, dan Negara Bagian Federasi Mikronesia, adalah satu-satunya negara/wilayah yang menggunakan mdy, yang tidak diurutkan. Urutan campuran format cocok dengan pola ucapan verbal dalam tanggal lisan.

Contoh kode SET DATEFORMAT: mdy versus dmy

Contoh kode Transact-SQL berikut menggunakan string karakter tanggal yang sama dengan tiga pengaturan DATEFORMAT yang berbeda. Eksekusi kode menghasilkan output yang ditunjukkan dalam komentar:

DECLARE @yourDateString NVARCHAR(10) = '12-09-2018';
PRINT @yourDateString + '  = the input.';

SET DATEFORMAT dmy;
SELECT CONVERT(DATE, @yourDateString) AS [DMY-Interpretation-of-input-format];

SET DATEFORMAT mdy;
SELECT CONVERT(DATE, @yourDateString) AS [MDY-Interpretation-of-input-format];

SET DATEFORMAT ymd;
SELECT CONVERT(DATE, @yourDateString) AS [YMD-Interpretation--?--NotGuaranteed];


/***  Actual output:
12-09-2018  = the input.

DMY-Interpretation-of-input-format
2018-09-12

MDY-Interpretation-of-input-format
2018-12-09

YMD-Interpretation--?--NotGuaranteed
2018-12-09
***/

Dalam contoh kode sebelumnya, contoh akhir memiliki ketidakcocokan antara format ymd versus string input. Simpul ketiga dari string input mewakili nilai numerik yang terlalu besar untuk menjadi hari. Microsoft tidak menjamin nilai output dari ketidakcocokan tersebut.

CONVERT menawarkan kode eksplisit untuk kontrol deterministik format tanggal

Artikel dokumentasi CAST and CONVERT kami mencantumkan kode eksplisit yang dapat Anda gunakan dengan fungsi CONVERT untuk mengontrol konversi tanggal secara deterministik. Setiap bulan artikel ini memiliki salah satu jumlah gambaran halaman tertinggi kami.

Tingkat kompatibilitas 90 ke atas

Di SQL Server 2000, tingkat kompatibilitasnya adalah 80. Untuk pengaturan tingkat 80 atau di bawahnya, konversi tanggal implisit adalah deterministik.

Dimulai dengan SQL Server 2005 dan tingkat kompatibilitasnya 90, konversi tanggal implisit menjadi nondeterministik. Konversi tanggal menjadi tergantung pada SET LANGUAGE dan SET DATEFORMAT yang dimulai dengan level 90.

Unicode

Konversi data karakter non-Unicode antar kolaterministik juga dianggap tidak deterministik.

Lihat juga