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

Giá trị được lưu trữ trong tableA.date là '2015-08-24' nghĩa là dữ liệu không có vấn đề gì.SQL không cho phép truyền cột ngày thành datetime?

Khi tôi thực hiện tuyên bố trên, tôi nhận được

Việc chuyển đổi một kiểu dữ liệu ngày một kiểu dữ liệu datetime dẫn đến một giá trị out-of-range

Tôi có thể biết tại sao không thể đúc một cột date đến datetime?

+3

Bạn có chắc chắn TẤT CẢ các giá trị trong 'a.date' là ngày hợp lệ theo định dạng rõ ràng không? (ví dụ: '1-2-2015' là mơ hồ vì có thể là ngày 1 tháng 2 ngày 1 tháng 2) –

+0

@D Stanley: Nó có một hàng dữ liệu có giá trị' 0001-01-01 ', đây có thể là lý do tại sao nó ném tôi lỗi đó? –

+0

bạn sẽ nhận được gì nếu bạn chạy chọn tối đa (a.date), min (a.date) từ tableA a – Kevin

Trả lời

8

Các nguyên nhân gốc rễ của vấn đề là thế này:

  • kiểu dữ liệu DATE có một loạt các giá trị được chấp nhận từ 01-01-0001 qua 12-31-9999
  • loại dữ liệu DATETIME có nhiều giá trị được chấp nhận từ 01-01-1753 đến 12-31-9999

Vì vậy, nếu bạn tình cờ có một số DATE từ trước năm 1753 hoặc giá trị rỗng/NULL - giá trị này nằm ngoài phạm vi DATETIME có thể xử lý.

Bạn nên ngừng sử dụngDATETIME Trong SQL Server và mới hơn. Sử dụng DATETIME2(n) thay thế (trong đó n là viết tắt của số giây phân số bạn cần).

Vì vậy, cố gắng này:

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

và tôi chắc chắn điều này sẽ chỉ làm việc tốt.

0

Sử dụng yyyymmdd định dạng đó là phổ biến trong máy chủ sql,

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

Tôi không thấy vấn đề với '0001-01-01' giá trị trong a.Date U có thể làm một thủ thuật bẩn chút như thế này

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

Hãy thử kết hợp ISDATE() chỉ để đảm bảo dữ liệu hợp lệ. (Có vẻ như tableA.date là một chuỗi.)

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) 
Các vấn đề liên quan