Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana SQL Server memutuskan format untuk konversi datetime implisit?

Ini dapat bergantung pada berbagai faktor - pengaturan regional sistem operasi, bahasa pengguna saat ini, dan pengaturan format tanggal. Secara default, Windows menggunakan US English , dan setelan pengguna adalah US English dan MDY .

Namun berikut adalah beberapa contoh untuk menunjukkan bagaimana hal ini dapat berubah.

Pengguna menggunakan setelan bahasa INGGRIS:

-- works:
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');

-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO

(Kesalahan)

Pengguna menggunakan Français:

-- works:
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');

-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO

(Kesalahan)

Pengguna kembali menggunakan Français:

SET LANGUAGE FRENCH;

-- fails (proving that, contrary to popular belief, YYYY-MM-DD is not always safe):
SELECT CONVERT(DATETIME, '2012-04-30');
GO

(Kesalahan)

Pengguna menggunakan DMY alih-alih MDY:

SET LANGUAGE ENGLISH;
SET DATEFORMAT DMY;

-- works:
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');

-- fails:
SELECT CONVERT(DATETIME, '04-30-2012');
GO

(Kesalahan)

Taruhan terbaik Anda, selalu, adalah menggunakan format tanggal standar ISO, non-regional, aman, dan tidak ambigu. Dua yang biasanya saya rekomendasikan adalah:

YYYYMMDD                  - for date only.
YYYY-MM-DDTHH:MM:SS[.mmm] - for date + time, and yes that T is important.

Tak satu pun dari ini gagal:

SET DATEFORMAT MDY;
SET LANGUAGE ENGLISH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET DATEFORMAT DMY;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');

Oleh karena itu, saya sangat menyarankan bahwa alih-alih membiarkan pengguna mengetik dalam format tanggal teks gratis (atau Anda menggunakan format yang tidak dapat diandalkan sendiri), kendalikan string input Anda dan pastikan mereka mematuhi salah satu format aman ini. Maka tidak masalah pengaturan apa yang dimiliki pengguna atau pengaturan regional yang mendasarinya, tanggal Anda akan selalu ditafsirkan sebagai tanggal yang dimaksudkan. Jika saat ini Anda mengizinkan pengguna memasukkan tanggal ke dalam bidang teks pada formulir, berhenti melakukannya dan terapkan kontrol kalender atau setidaknya daftar pilihan sehingga Anda akhirnya dapat mengontrol format string yang diteruskan kembali ke SQL Server.

Untuk beberapa latar belakang, silakan baca "Panduan pamungkas untuk datetime" dari Tibor Karaszi. tipe data" dan posting saya "Buruk Kebiasaan untuk Ditendang :Salah menangani kueri tanggal/rentang."



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PILIH BERBEDA pada satu kolom

  2. Bagaimana saya bisa keluar dari tanda kurung siku dalam klausa LIKE?

  3. Statistik Database Pembaruan SQL Server

  4. Memasukkan data SQL Server ke Salesforce.com

  5. Apa yang Baru di SQL Server 2019?