Konversi nondeterministik string tanggal harfiah menjadi nilai DATE

Berlaku untuk: SQL Server Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform 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 mempertangungjawabkan pengaturan SET LANGUAGE dan SET DATEFORMAT.

CONTOH SET LANGUAGE: Nama bulan dalam bahasa Polandia

  • SET LANGUAGE Polish;

String karakter bisa menjadi nama sebulan. Tapi 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 itu tergantung pada bahasa yang diyakini sistem SQL sedang digunakan:

  • Jika Bahasa Polandia, maka listopad diterjemahkan ke bulan 11 (November dalam bahasa Inggris).
  • Jika bahasa Kroasia, maka listopad diterjemahkan ke 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 dengan arti 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 apa outputnya. Nilai numerik '2018' terlalu besar untuk menjadi hari.

Negara/wilayah tertentu

Di Jepang dan Tiongkok, DATEFORMAT 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 ini adalah 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 dan 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 tampilan halaman tertinggi kami.

Tingkat kompatibilitas 90 ke atas

Pada 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 kompatibilitas 90, konversi tanggal implisit menjadi nondeterministik. Konversi tanggal menjadi tergantung pada SET LANGUAGE dan SET DATEFORMAT yang dimulai dengan tingkat 90.

Unicode

Konversi data karakter non-Unicode antar kolab juga dianggap nondeterministik.

Lihat juga