SQL Server 2000无法将nvarchar转换为datetime

时间:2011-05-24 16:58:59

标签: sql datetime sql-server-2000

在表格中有一个数据类型为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()

有人可以帮助诊断问题吗

2 个答案:

答案 0 :(得分:2)

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

确切地确定伪造字符是什么。

答案 1 :(得分:0)

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

我认为你的前1名是否选择null是不重要的,因为我认为评估失败,因为列可以为空。我在SQL Server 2008 R2中做了一个快速测试,它运行正常。