Pertanyaan SQL tidak memungkinkan untuk mentransmisi kolom tanggal ke datetime?


Select * 
from tableA 
inner join tableB on tableA.id = tableB.aid 
                  and cast(a.date AS DATETIME) = CAST('2015-08-24' AS DATETIME) 

Nilai yang disimpan di tableA.date adalah '2015-08-24' artinya data tidak memiliki masalah.

Ketika saya mengeksekusi pernyataan di atas, saya mengerti

Konversi tipe data tanggal ke tipe data datetime menghasilkan nilai di luar jangkauan

Bolehkah saya tahu mengapa tidak bisa melempar date kolom ke datetime?


7
2017-09-14 15:08


asal


Jawaban:


Itu akar masalah masalahnya adalah ini:

  • tipe data DATE memiliki rentang nilai yang diterima dari 01-01-0001 melalui 12-31-9999
  • tipe data DATETIME memiliki rentang nilai yang diterima dari 01-01-1753 melalui 12-31-9999

Jadi jika Anda kebetulan memiliki DATE dari sebelum 1753, atau nilai kosong / NULL - ini akan berada di luar jangkauan itu DATETIME dapat menangani.

Kamu harus berhenti menggunakan  DATETIME Di SQL Server 2008 dan yang lebih baru. Menggunakan DATETIME2(n) sebagai gantinya (dimana n singkatan dari jumlah detik pecahan yang Anda butuhkan).

Jadi coba ini:

select * 
from tableA 
inner join tableB on tableA.id = tableB.aid 
                  and cast(a.date AS DATETIME2(3)) = CAST('2015-08-24' AS DATETIME2(3)) 

dan saya yakin ini akan bekerja dengan baik.


9
2017-09-14 16:41



Gunakan format yyyymmdd yang universal di server sql,

Select * from tableA inner join tableB 
on tableA.id = tableB.aid 
and cast(a.date AS DATETIME) = CAST('20150824' AS DATETIME) 

Saya tidak melihat masalah dengan nilai '0001-01-01' dalam A.Date Kamu bisa melakukan trik kotor seperti ini

Select * from tableA inner join tableB 
on tableA.id = tableB.aid 
and case when substring(a.date, 1, 2) not in ('19', '20') then null else CAST(a.date AS DATETIME) end = CAST('20150824' AS DATETIME) 

0
2017-09-14 15:17



Cobalah memasukkan ISDATE () hanya untuk memastikan data valid. (Kedengarannya seperti tableA.date adalah string.)

    Select * from tableA inner join tableB 
        on tableA.id = tableB.aid 
        and ISDATE(tableA.date)
        and cast(tableA.date AS DATETIME) = CAST('2015-08-24' AS DATETIME)

0
2017-09-14 15:38