Konversi gagal saat mengonversi tanggal dan / atau waktu dari string karakter saat memasukkan datetime


164

Saya mencoba membuat tabel sebagai berikut,

create table table1(date1 datetime,date2 datetime);

Pertama saya mencoba memasukkan nilai seperti di bawah ini,

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

Itu telah memberikan kesalahan mengatakan,

Tidak dapat mengonversi varchar ke datetime

Kemudian saya mencoba format di bawah ini sebagai salah satu posting yang disarankan oleh stackoverflow kami,

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

Namun saya masih mendapatkan kesalahan dengan mengatakan,

Konversi gagal saat mengonversi tanggal dan / atau waktu dari string karakter

Ada saran?


2
@Damien_The_Unbeliever seperti yang Anda katakan saya sudah merujuk posting ini stackoverflow.com/questions/12957635/... sebelum mengajukan pertanyaan ini. Mereka meminta kami untuk menggunakan nilai 'insert table1 (approvaldate) (convert (datetime, '18 -06-12 10:34:09 PM', 5)); ' tetapi tidak berhasil
Mari

Jawaban:


163

Ada banyak format yang didukung oleh SQL Server - lihat MSDN Books Online tentang CAST dan CONVERT . Sebagian besar format itu tergantung pada pengaturan apa yang Anda miliki - karena itu, pengaturan ini mungkin berfungsi beberapa kali - dan kadang-kadang tidak.

Cara untuk mengatasi ini adalah dengan menggunakan format tanggal ISO-8601 (sedikit disesuaikan) yang didukung oleh SQL Server - format ini selalu berfungsi - terlepas dari bahasa SQL Server Anda dan pengaturan format tanggal .

Format ISO-8601 didukung oleh SQL Server hadir dalam dua rasa:

  • YYYYMMDDhanya untuk tanggal (tanpa porsi waktu); perhatikan di sini: tidak ada garis putus-putus! , itu sangat penting! YYYY-MM-DDadalah TIDAK independen dari pengaturan dateformat di SQL Server dan akan tidak bekerja dalam segala situasi!

atau:

  • YYYY-MM-DDTHH:MM:SSuntuk tanggal dan waktu - perhatikan di sini: format ini memiliki tanda hubung (tetapi dapat dihilangkan), dan ditetapkan Tsebagai pembatas antara tanggal dan bagian waktu Anda DATETIME.

Ini berlaku untuk SQL Server 2000 dan yang lebih baru.

Jadi dalam kasus konkret Anda - gunakan string ini:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

dan Anda harus baik-baik saja (catatan: Anda perlu menggunakan format internasional 24 jam daripada format AM / PM 12 jam untuk ini).

Atau : jika Anda menggunakan SQL Server 2008 atau yang lebih baru, Anda juga dapat menggunakan DATETIME2tipe data (bukan yang biasa DATETIME) dan saat ini Anda INSERThanya akan berfungsi tanpa masalah! :-) DATETIME2jauh lebih baik dan jauh lebih sedikit pemilih pada konversi - dan itu adalah tipe data tanggal / waktu yang direkomendasikan untuk SQL Server 2008 atau yang lebih baru.

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

Jangan tanya saya mengapa seluruh topik ini begitu rumit dan membingungkan - begitulah adanya. Tetapi dengan YYYYMMDDformat, Anda harus baik untuk versi SQL Server dan untuk pengaturan bahasa dan format tanggal apa pun di SQL Server Anda.


1
Sama seperti catatan, casting sebagai DATETIME2 juga bekerja dengan 'YYYY-MM-DDTHH: MM: SSZ' (note 'Z' - waktu Zulu di akhir untuk menunjukkan cap waktu UTC). Saya punya kesalahan ini ketika mencoba memasukkan '2013-12-16T17: 21: 26Z' di bidang datetime. Hanya untuk memperjelas, ISO 8601 didukung sebagian. Itu tidak mendukung waktu Zulu, meskipun disebutkan dalam dokumentasi. Mungkin ini adalah pengaturan yang belum sempat saya pikirkan, tetapi jika seseorang memiliki masalah yang sama, ingatlah itu.
Michał

3
Saya dapat mengkonfirmasi bahwa format tanggal 'YYYYMMDD' berfungsi dengan baik, mencobanya di SQL Server 2014, sebagai cara untuk menentukan tanggal literal dalam klausa WHERE. Banyak tank ke @marc_s
Giorgio Barchiesi

1
Hal DATETIME2 bekerja untuk saya. Dalam kasus saya, saya mengimpor skrip database dari SQLServer dalam bahasa Inggris ke versi Spanyol, jadi setiap kali kesalahan yang sama. Saya hanya mengganti dalam skrip semua "sebagai DATETIME" mata uang untuk "sebagai DATETIME2" dan masalah diselesaikan.
Alejandro del Río

24

Konversi dalam SQL server gagal kadang-kadang bukan karena format Tanggal atau Waktu yang digunakan, Ini Hanya karena Anda mencoba untuk menyimpan data yang salah yang tidak dapat diterima oleh sistem.

Contoh:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

Server SQL akan melempar kesalahan berikut:

Conversion failed when converting date and/or time from character string.

Alasan untuk kesalahan ini adalah karena tidak ada tanggal (29 Feb) di Tahun (2015).


2
"Alasan untuk kesalahan ini adalah karena tidak ada tanggal tersebut (29 Februari) di Tahun (2015)" Ini adalah alasan mengapa saya mendapatkan kesalahan ini. Jawaban ini mempertimbangkan penyebab paling umum dari kesalahan ini, sedangkan jawaban lainnya tidak.
FirstFraktal

1
Saya mengimpor data dari lembar Excel di mana nilai nol sebenarnya memiliki "NULL" di dalam sel. Ini ditetapkan sebagai string "Null" di tabel DB, jadi sedang mencoba untuk mengubah string "Null" menjadi datetime. Seharusnya mengosongkan sel "NULL" di Excel. Saya seorang idiot: /
karol

17

Jawaban sederhana - 5 adalah bahasa Italia "yy" dan 105 adalah bahasa Italia "yyyy". Karena itu:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

akan bekerja dengan benar, tetapi

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

akan memberikan kesalahan.

Juga,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

akan memberikan kesalahan, dimana sebagai

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

akan bekerja.


8

Cukup perbarui format tanggal seperti di bawah ini

yyyy-MM-dd hh:MM:ss

Ini memecahkan masalah bagi saya dan berfungsi dengan baik


2
Silakan baca jawaban lain yang sudah disediakan. Format ini hanya berfungsi untuk Anda karena DATEFORMATpengaturan sesi Anda . Verifikasi ini dengan menjalankan SET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);. Ini akan bekerja dengan andal jika Anda menambahkan Tseparator ( yyyy-MM-ddTHH:mm:ss).
Dan Guzman

1
Terima kasih banyak ya Anda benar itu menyelesaikan masalah saya dan saya membaca jawaban lain yang diberikan di sini
Pronab Roy

8

Jika memungkinkan seseorang harus menghindari literal tanggal / waktu spesifik budaya .

Ada beberapa format aman untuk memberikan tanggal / waktu sebagai literal:

Semua contoh untuk 2016-09-15 17:30:00

ODBC (favorit saya, karena ditangani sebagai tipe nyata segera)

  • {ts'2016-09-15 17:30:00'} - Stempel Waktu
  • {d'2016-09-15'} --Tanggal saja
  • {t'17:30:00'} --Waktu saja

ISO8601 (yang terbaik untuk semua tempat )

  • '2016-09-15T17:30:00'--Sadarilah Tdi tengah!

Unseperated (risiko kecil untuk disalahartikan sebagai angka)

  • '20160915' --hanya untuk kencan murni

Baik untuk diingat: Tanggal tidak valid cenderung muncul dengan kesalahan aneh

  • Tidak ada tanggal 31 Juni atau 30 Februari ...

Satu lagi alasan untuk kesalahan konversi yang aneh: Urutan eksekusi!

SQL-Server tahu benar untuk melakukan hal-hal dalam urutan eksekusi yang mungkin tidak diharapkan. Pernyataan tertulis Anda terlihat seperti konversi dilakukan sebelum beberapa jenis tindakan terkait terjadi, tetapi mesin memutuskan - mengapa pernah - untuk melakukan konversi pada langkah selanjutnya.

Berikut ini adalah artikel yang bagus menjelaskan hal ini dengan contoh: Rusano.com: "t-sql-functions-do-no-imply-a-order-of-eksekusi-eksekusi" dan inilah pertanyaan terkait .


3

cara terbaik adalah kode ini

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"

2
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,

1
Jika Anda menggunakan backticks, bukan spasi awal, Anda akan mendapatkan pembungkus kata.
Jesse W di Z - Diberikan pada SE

2

Format datetime sebenarnya yang berjalan di sql server adalah

yyyy-mm-dd hh:MM:ss

1
Tidak, ini tidak benar (selain ketidakcocokan dari mdan M). Baca komentar Dan Guzman untuk jawaban Pronab Roy. Dan baca jawaban lain di sini ...
Shnugo

2

Silakan Coba ini.

SQL Server mengharapkan tanggal dalam format MM / DD / YYYY, Jika Bahasa Inggris ditetapkan sebagai bahasa default Anda. Di sini saya menyimpan nilai datepicker ke database sql2008. Tipe bidang saya adalah datetime dalam database.dpdob adalah nama datepicker saya.

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

Sekarang gunakan dob dalam permintaan memasukkan Anda.


1

Anda dapat mencoba kode ini

select (Convert(Date, '2018-04-01'))

1

Saya memiliki masalah ini ketika mencoba menyatukan getdate()ke dalam string yang saya masukkan ke bidang nvarchar.

Saya melakukan casting untuk menyiasatinya:

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

Itu contoh yang bersih. Bagian utama dari itu adalah:

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

Dicoret tanggalnya datetime2, lalu nvarchardigabungkan.


1

Saya sudah mencoba ini dan itu bekerja dengan saya:

SELECT CONVERT(date, yourDate ,104)

0

setel Budaya ke bahasa Inggris dari file web.config

  <globalization uiCulture="en-US" culture="en-US" />

misalnya jika Anda mengatur budaya ke bahasa Arab, maka thime akan

22/09/2017 02:16:57 ص

dan Anda mendapatkan kesalahan: Konversi gagal saat mengubah tanggal dan / atau waktu dari string karakter saat memasukkan datetime



0

Bagi saya ini berhasil:

INSERT INTO [MyTable]
           ([ValidFrom]
           ,[ValidTo])
       VALUES
           ('2020-01-27 14:54:11.000'
           ,'2023-01-27 14:52:50.000')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.