Konversi gagal ketika mengubah tanggal dan/atau waktu dari karakter string sambil memasukkan datetime

Saya mencoba untuk membuat sebuah tabel sebagai berikut,

create table table1(date1 datetime,date2 datetime);

Pertama saya mencoba memasukkan nilai-nilai seperti di bawah ini,

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

Telah memberikan kesalahan yang mengatakan,

Tidak dapat mengkonversi ke datetime varchar

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

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

Tapi saya masih mendapatkan error mengatakan,

Konversi gagal ketika mengubah tanggal dan/atau waktu dari karakter string

Ada saran?

Mengomentari pertanyaan (1)
Larutan

Ada banyak format yang didukung oleh SQL Server - lihat MSDN Buku Online di COR dan MENGKONVERSI. Sebagian besar dari format tersebut adalah tergantung pada pengaturan apa yang anda miliki - oleh karena itu, pengaturan ini mungkin bekerja beberapa kali - dan kadang-kadang tidak.

Cara untuk memecahkan masalah ini adalah dengan menggunakan (sedikit disesuaikan) ISO-8601 format tanggal yang didukung oleh SQL Server - format ini bekerja selalu - terlepas dari SQL Server bahasa dan pengaturan dateformat.

The ISO-8601 format didukung oleh SQL Server datang dalam dua rasa:

  • YYYYMMDD hanya untuk tanggal (tidak ada waktu porsi); catatan berikut: tidak ada tanda hubung!, yang's sangat penting! YYYY-MM-DD adalah TIDAK independen dari pengaturan dateformat di SQL Server anda dan akan TIDAK **** bekerja pada semua situasi!

atau:

  • YYYY-MM-DDTHH:MM:SS untuk tanggal dan waktu - catatan berikut ini: format ini telah tanda hubung (tapi mereka ** bisa dihilangkan), dan tetap T sebagai pembatas antara tanggal dan waktu sebagian dari anda DATETIME.

Ini berlaku untuk SQL Server 2000 dan yang lebih baru.

Jadi dalam kasus beton - menggunakan 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 internasional 24 format lebih dari 12 jam AM/PM format ini).

Atau: jika anda're pada SQL Server 2008 atau yang lebih baru, anda juga bisa menggunakan datetime2 datetimeand datatype (bukan polos DATETIME) dan anda saat ini INSERT hanya akan bekerja tanpa masalah! :-) Datetime2 datetimeand adalah jauh lebih baik dan jauh lebih pilih-pilih pada konversi - dan's merekomendasikan date/time tipe data untuk SQL Server 2008 atau yang lebih baru pula.

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  

Don't meminta saya mengapa ini seluruh topik ini begitu rumit dan agak membingungkan - yang's hanya cara itu. Tapi dengan YYYYMMDD format, anda harus baik untuk setiap versi dari SQL Server dan untuk setiap bahasa dan dateformat pengaturan di SQL Server.

Komentar (3)

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

Contoh:

Membuat Tabel MyTable (MyDate);

Masukkan Ke MyTable(MyDate) Nilai-Nilai ('2015-02-29');

SQL server akan melemparkan kesalahan berikut:

Conversion failed when converting tanggal dan/atau waktu dari karakter string.

Alasan untuk ini kesalahan hanya ada tanggal tersebut (Feb-29) di Tahun ini (2015).

Komentar (2)

Jawaban sederhana - 5 italia "yy" dan 105 italia "yyyy". Oleh karena itu:

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

akan bekerja dengan benar, tapi

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

akan memberikan kesalahan.

Demikian juga,

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

akan memberikan kesalahan, di mana sebagai

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

akan bekerja.

Komentar (0)

Bila memungkinkan satu harus menghindari budaya tanggal tertentu/waktu literal.

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

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

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

  • {ts'2016-09-15 17:30:00'} --Cap Waktu
  • {d'2016-09-15'} --Saat ini hanya
  • {t'17:30:00'} --Waktu hanya

ISO8601 (terbaik untuk dimana-mana)

  • '2016-09-15T17:30:00' --diketahui dari T di tengah!

Unseperated (kecil risiko untuk mendapatkan disalahartikan sebagai nomor)

  • '20160915' --hanya untuk murni tanggal

Baik untuk menjaga dalam pikiran: tidak Valid tanggal cenderung muncul dengan kesalahan aneh

  • Tidak ada tanggal 31 juni atau 30 februari...

Satu lagi alasan yang aneh konversi kesalahan: Urutan eksekusi!

SQL Server juga tahu untuk melakukan hal-hal dalam rangka pelaksanaan salah satu yang mungkin tidak diharapkan. Pernyataan tertulis anda terlihat seperti konversi selesai sebelum beberapa jenis terkait dengan tindakan mengambil tempat, tapi mesin memutuskan - mengapa - untuk melakukan konversi pada langkah berikutnya.

Berikut ini adalah artikel yang menjelaskan hal ini dengan contoh-contoh: Rusano.com: "t-sql-functions-do-no-imply-a-certain-order-of-execution" dan di sini adalah terkait pertanyaan.

Komentar (0)

Hanya memperbarui tanggal format seperti di bawah ini

yyyy-MM-dd hh:MM:ss

Memecahkan masalah untuk saya dan itu bekerja dengan baik

Komentar (2)

cara terbaik adalah kode ini

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

Silakan Coba ini.

SQL Server mengharapkan tanggal dalam MM/DD/YYYY,Jika bahasa inggris ditetapkan sebagai bahasa default anda.Di sini saya menabung datepicker nilai untuk sql2008 database.Saya tipe field datetime di database.dpdob saya datepicker nama.

           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 menggunakan dob di menyisipkan query.

Komentar (0)
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,
Komentar (1)

Datetime format sebenarnya yang berjalan pada sql server

yyyy-mm-dd hh:MM:ss
Komentar (1)

Anda dapat mencoba kode ini

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

Aku punya masalah ini ketika mencoba untuk menggabungkan getdate() menjadi sebuah string yang aku memasukkan ke dalam nvarchar lapangan.

Aku melakukan casting untuk mendapatkan sekitar ini:

 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 />'
   )

Yang's dibersihkan contoh. Bagian utama dari itu adalah:

...&#39; + COR(CAST(getdate() SEBAGAI datetime2 datetimeand) SEBAGAI nvarchar) + &#39;...

Dicor tanggal sebagai datetime2 datetimeand, maka sebagai nvarchar untuk menggabungkan itu.

Komentar (0)

set Budaya untuk bahasa inggris dari web.config

misalnya jika anda menetapkan budaya arab saat akan

22/09/2017 02:16:57 ini.

dan anda mendapatkan error:Konversi gagal ketika mengubah tanggal dan/atau waktu dari karakter string sambil memasukkan datetime

Komentar (0)