我有一个名为date_finish
的SQL数据库varchar字段。该字段已设置为varchar(50)。日期的格式如下:07/06/2017 dd / mm / yyyy。
我正在尝试使用以下语句在数据库中搜索1岁以上的所有日期:
SELECT CONVERT(datetime, date_finish, 103) AS DB_DATE, booking_code, cust_id, status
FROM repair_details
WHERE (date_finish > DATEADD(year, - 1, GETDATE()))
ORDER BY DB_DATE
有些字段为空白,cust_id为0且状态不完整,因此我添加了:
(date_finish <> '') AND (status = 'COMPLETE') AND (cust_id <> '0')
以上陈述。
在所有情况下,我都会收到错误:
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。
我做错了什么???
答案 0 :(得分:2)
使用显式格式转换为日期:
WHERE CONVERT(date, date_finish, 103) > DATEADD(year, - 1, GETDATE())
显然,根据您的代码,这会在一年前获得日期。如果您想要更早的日期,请使用<
而不是>
。
然后,修复数据!您应该使用适当的类型存储日期/时间值。一种方法是:
update repair_details
set date_finish = CONVERT(date, date_finish, 103); -- sets to default date format on system
alter repair_details alter date_finish date;
答案 1 :(得分:0)
您尚未在WHERE子句中完成日期转换 - 它将字符串与日期进行比较。
答案 2 :(得分:0)
错误是因为,当列date_finish
看起来为空时。因此,您需要有一个条件:
((date_finish IS NOT NULL ) AND
(date_finish <> '' ) ) AND
(status = 'COMPLETE' ) AND
(cust_id <> '0' )