我的所有列都是varchar
所以我使用公共表达式表将[Column 0]
转换为datetime
,因为[Column 0]
包含此格式的日期2012-02-28 00:00:08.000
WITH pss AS
(
select CONVERT(datetime, [Column 0]) as t, [Column 1], [Column 2], [Column 3], [Column 4], [Column 5], [Column 6]
from PWS where [Column 0] like '%2/28%'
)
select *from pss where datepart(HOUR,[t]) >= '11' AND datepart(HOUR,[t]) <= '12'
我收到以下消息
Msg 242,Level 16,State 3,Line 1
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。
答案 0 :(得分:2)
您还需要提供CONVERT提示,以了解varchar中日期的结构。 ymd序列将被识别为102:
convert(datetime, '2012-02-28 00:00:08.000', 102)
有关CONVERT的说明和可用的日期时间样式,请参阅http://msdn.microsoft.com/en-us/library/ms187928.aspx
答案 1 :(得分:0)
SQL Server中不允许使用早于1753年1月1日的日期时间数据类型的值。 SQL Server仅接受从1753年到9999年的日期。如果表中的Column0包含早于1753年1月1日的日期,则可能存在此类问题。
答案 2 :(得分:0)
如果所有其他方法都失败了,我会使用游标*循环遍历每一行,然后,对于每一行,尝试将[Column 0]的值转换为DateTime。使用TRY..CATCH块对CONVERT尝试进行环绕,然后在CATCH块中输出一些诊断信息,以便准确判断哪一行导致了错误。
注意*:是的,通常要避免使用游标,但在这种诊断情况下我认为它很有用。