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?

Mari
sumber
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.

marc_s
sumber
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).

Ashraf Abusada
sumber
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.

Raj
sumber
8

Cukup perbarui format tanggal seperti di bawah ini

yyyy-MM-dd hh:MM:ss

Ini memecahkan masalah bagi saya dan berfungsi dengan baik

Pronab Roy
sumber
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 .

Shnugo
sumber
3

cara terbaik adalah kode ini

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
Ahmed Soliman
sumber
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,
ARLE ANDINO
sumber
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
Bhavya Dhiman
sumber
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.

SWR
sumber
1

Anda dapat mencoba kode ini

select (Convert(Date, '2018-04-01'))
Biddut
sumber
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.

vapcguy
sumber
1

Saya sudah mencoba ini dan itu bekerja dengan saya:

SELECT CONVERT(date, yourDate ,104)
Abd Abughazaleh
sumber
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

Yusuf
sumber
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')
Joel Wiklund
sumber