转换sql中where子句中的日期

iklwldmw  于 2021-07-29  发布在  Java
关注(0)|答案(4)|浏览(361)

我需要在过去30天内归还一些东西的总和。我的日期字段是文本字段。我的table看起来像这样:

Client    Serial#        Hrs        MyDate
A         1              12         20200501
A         1              8          20200513
B         5              2          20200521
B         6              3          20200522
A         2              5          20200528
A         2              2          20200529

我的代码如下所示:

SELECT Client, Serial#, SUM(Hrs)
FROM MyTable
WHERE CONVERT(DATETIME, MyDate, 112) > DATEADD(day, -30, getdate())
GROUP BY Client, Serial#

这是我得到的错误“将varchar数据类型转换为datetime数据类型导致值超出范围。”
我尝试删除convert函数,但遇到另一个错误:“将varchar数据类型转换为datetime数据类型导致值超出范围。”
所以现在我被困住了。提前谢谢你的帮助

bf1o4zei

bf1o4zei1#

因为您没有其他选择可以使用varchar作为日期,所以我会将一个getdate()值转换为varchar,而不是将所有行转换为日期。这是可能的,因为它们存储为yyyymmdd。我认为这样对性能会更好(当然,如果你在这个日期栏上有索引的话)。

WHERE MyDate > CONVERT(varchar(10),dateadd(d,-30,getdate()),112)
bvjveswy

bvjveswy2#

你可以用 try_convert() :

WHERE TRY_CONVERT(DATE, MyDate) > DATEADD(day, -30, getdate())

您的格式是sql server为日期常量定义的格式,因此实际上不需要format参数。
您可以使用以下方法查找有问题的值:

select mydate
from t
where try_convert(date, mydate) is null and mydate is not null;

请注意 date s和 datetime 有不同的范围,所以使用 date 相反,它可能会解决问题。

e5njpo68

e5njpo683#

SELECT Client, Serial, SUM(Hrs)
FROM MyTable
WHERE CONVERT(DATETIME, MyDate) > DATEADD(day, -30, getdate())
GROUP BY Client, Serial

您不需要格式112进行比较

piah890a

piah890a4#

您的convert函数看起来还可以(虽然112不需要转到datetime,也就是datetime到字符串的转换),所以我打赌您在这些日期字符串的某个地方有一些不好的数据。日期必须在1753年1月1日至9999年12月31日之间。尝试对该字段进行排序,看看列表顶部或底部是否有可疑的内容。
您可以添加筛选器:

AND MyDate BETWEEN '17530101' and '99991231'
    AND LEN(MyDate) = 8

相关问题