SQL Server 2000在将nvarchar转换为datetime时遇到问题

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() 

有人可以帮助诊断问题请

+1

数据是否将'null'表示为字符串,或者是记录实际上是否为NULL? – JNK 2011-05-24 17:04:56

+0

它实际上是NULL – mattgcon 2011-05-24 17:17:58

这两种日期格式转换得很好。默认的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 

,以确定到底是什么假的字符是。

+0

大声笑这就是问题,我现在是“DBA”。过去常常运行这个操作的老人不知道他在做什么(到处都是冗余和空列)我正在跟着学习 – mattgcon 2011-05-24 17:52:18

+0

好吧我实际上是通过该查询获取27行数据。被退回的物品都很好看。他们是有效的日期或有效的日期和时间 – mattgcon 2011-05-24 18:10:00

+0

我也倾倒了一个临时表的结果,第三列给我的东西像“0x4400650063002E002000310035002C0020003200300030003800” – mattgcon 2011-05-24 18:13:39

你可以转换为较新版本的SQL Server吗?如果是这样,这个问题会自行解决。如果不是,你必须从等式中排除空值,因为它们是这里的问题。

我认为这不重要,如果您的前1名选择空或不,因为我认为评估失败,因为列可以为空。我在SQL Server 2008 R2中做了一个快速测试,它工作正常。

+0

我们正在转换,但不是一段时间。这需要在此之前完成,因为我们正在转换的日期是未知的。我也尝试过使用NOT ApplicationDueDate IS NULL的附加子句,但仍然收到错误 – mattgcon 2011-05-24 17:20:02

+0

哦,我把1放在那里只是为了使查询变得简单,它与我实际返回的内容无关 – mattgcon 2011-05-24 17:20:42

+0

@matt - based在他的回答中,只有在列接受NULL时才有意义,而不是实际上是否有数据。 – JNK 2011-05-24 17:24:23