我需要在过去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数据类型导致值超出范围。”
所以现在我被困住了。提前谢谢你的帮助
4条答案
按热度按时间bf1o4zei1#
因为您没有其他选择可以使用varchar作为日期,所以我会将一个getdate()值转换为varchar,而不是将所有行转换为日期。这是可能的,因为它们存储为yyyymmdd。我认为这样对性能会更好(当然,如果你在这个日期栏上有索引的话)。
bvjveswy2#
你可以用
try_convert()
:您的格式是sql server为日期常量定义的格式,因此实际上不需要format参数。
您可以使用以下方法查找有问题的值:
请注意
date
s和datetime
有不同的范围,所以使用date
相反,它可能会解决问题。e5njpo683#
您不需要格式112进行比较
piah890a4#
您的convert函数看起来还可以(虽然112不需要转到datetime,也就是datetime到字符串的转换),所以我打赌您在这些日期字符串的某个地方有一些不好的数据。日期必须在1753年1月1日至9999年12月31日之间。尝试对该字段进行排序,看看列表顶部或底部是否有可疑的内容。
您可以添加筛选器: