从SQL数据库中搜索超过一年的日期

时间:2018-06-08 22:10:28

标签: sql

我有一个名为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数据类型转换为日期时间数据类型会导致超出范围的值。

我做错了什么???

3 个答案:

答案 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'            )