SQL Server 2000在将nvarchar转换为datetime时遇到问题
问题描述:
在一个表内有一个包含数据类型datetime的列,我需要将此列中的数据与当前的日期和时间进行比较。SQL Server 2000在将nvarchar转换为datetime时遇到问题
我试图在该领域的转换,但我在列收到
Syntax error converting datetime from character string
值不幸的是有三种不同的格式(传统的垃圾)
November 28, 2005 -or-
5/1/2011 12:00:00 AM -or-
null
我的代码我使用的是如下:
SELECT 1 from webprograms where convert(datetime, ApplicationDueDate) < getdate()
有人可以帮助诊断问题请
答
这两种日期格式转换得很好。默认的convert
算法做了一个相当体面的工作,即灵活地处理它给出的内容。和一个null
字符串,正如我前面评论, will always convert to a
null datetime value: per the standard, any expression that involving
null yields
null`。
我怀疑你有数据问题。最有可能的垃圾字符,如嵌入的CR,LF或CR + LF(换行符)。 HT(制表符)字符也似乎打破convert()
。您(或您的DBA)可能需要执行数据清理以摆脱垃圾字符。或者你需要解决这个问题并编写一个丑陋的表达式来修复运行时的错误数据。
像这样的查询应该找出问题的数据:
select myCruftyDateTimeColumn,count(*)
from foo
where myCruftyDateTimeColumn is not null
-- m/d/yyyy hh:mm:ss AM format
and myCruftyDateTimeColumn not like '[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [AP]M'
and myCruftyDateTimeColumn not like '[0-9][0-9]/[0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [AP]M'
and myCruftyDateTimeColumn not like '[0-9]/[0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [AP]M'
-- month d, yyyy alternatives, 2 digit days
and myCruftyDateTimeColumn not like 'January [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'February [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'March [0-9][0-9], [0-9][0-9][0-9][0-9]'
and ...
and myCruftyDateTimeColumn not like 'October [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'November [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'December [0-9][0-9], [0-9][0-9][0-9][0-9]'
-- month d, yyyy alternatives, 2 digit days
and myCruftyDateTimeColumn not like 'January [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'February [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'March [0-9], [0-9][0-9][0-9][0-9]'
and ...
and myCruftyDateTimeColumn not like 'October [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'November [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'December [0-9], [0-9][0-9][0-9][0-9]'
group by myCruftyDateTimeColumn
order by 1
您可能需要加载一个临时表中的结果,然后,从该
select *,convert(varbinary,myCruftyDateTimeColumn)
from #bad_data
,以确定到底是什么假的字符是。
答
你可以转换为较新版本的SQL Server吗?如果是这样,这个问题会自行解决。如果不是,你必须从等式中排除空值,因为它们是这里的问题。
我认为这不重要,如果您的前1名选择空或不,因为我认为评估失败,因为列可以为空。我在SQL Server 2008 R2中做了一个快速测试,它工作正常。
数据是否将'null'表示为字符串,或者是记录实际上是否为NULL? – JNK 2011-05-24 17:04:56
它实际上是NULL – mattgcon 2011-05-24 17:17:58