为什么SQL Server为ISDATE返回0(' 13/01/2010')

时间:2012-07-11 12:24:00

标签: sql sql-server-2008-r2

我有一个视图,我在varchar formet和dd/MM/yyyy中有一个日期列 当我尝试使用它的顺序给出错误

  

消息241,级别16,状态1,行2转换时转换失败   字符串的日期和/或时间。

查询

select * from test1.dbo.abcd order by CONVERT(date,ddate,103)

返回0的某些日期为13/01/2010

18/12/2009
20/10/2009
21/06/2010
19/10/2009
18/11/2010
29/10/2009
29/10/2009
18/03/2010
15/03/2010
15/03/2010
15/03/2010
15/04/2010
15/04/2010
15/04/2010
15/04/2010
30/03/2010
14/05/2010
14/01/2010
23/10/2009
20/10/2009
27/10/2009
27/10/2009
20/07/2009
20/04/2010
13/08/2010
30/06/2011
23/07/2010
27/08/2010
24/09/2010

任何人都可以告诉我为什么它返回0以及如何对它进行排序?

4 个答案:

答案 0 :(得分:4)

set dateformat dmy可能会将其排除在外

答案 1 :(得分:4)

因为这对我来说很好:

SELECT CONVERT(date,'13/01/2010',103);

尝试:

ORDER BY CONVERT(DATE, LEFT(ddate, 10), 103);

我怀疑发生的事情是推入视图的数据包含您看不到的尾随字符(例如回车)或非打印字符。您可以通过以下方式检查超过10个字符的值:

SELECT ... WHERE LEN(ddate) > 10

如果仍然无效,那么数据可能确实很糟糕,例如也许是:

13/O1/2010

在这种情况下,您唯一可以做的就是首先推回表/视图的所有者以获取正确的数据,或尝试使用以下过滤掉:

SET DATEFORMAT DMY;

...
WHERE ISDATE(ddate) = 1

至于你问题中的标题,ISDATE在这种情况下返回0,因为默认情况下不是日期 - 在大多数情况下,SQL Server是使用美国英语和日期格式MDY设置的,因此它需要日期字符串格式为mm/dd/yyyy13/01/2010是2010年第13个月的第一天。我的记忆很粗略,但我确信那年没有第13个月。

正如其他人所建议的那样,对此的真正解决方法是将数据存储为日期/时间,而不是字符串,并以明确的格式传递字符串文字,例如: YYYYMMDD

答案 2 :(得分:2)

我猜问题是使用ISDATE()函数而不是CONVERT()

你可以尝试这个:

ISDATE( CONVERT(CHAR(10), CONVERT(date, ddate, 103) ) )

但我无法找到使用ISDATE()进行此检查的理由。以上将取决于 当DATEFORMAT函数找到不兼容的日期时,CONVERT()设置(以及我可能不知道的其他设置)并且会因错误而失败。


也许你可以做的最好的黑客,如果你不能将日期转换为DATE dataype,那么在你处理日期的任何情况下应该强调这是最好的事情< / strong>,是用这个检查:

ISDATE(SUBSTRING(ddate, 7, 4) + SUBSTRING(ddate, 4, 2) + SUBSTRING(ddate, 1, 2))

答案 3 :(得分:0)

13 / O1 / 2010默认美国日期格式为第13个月的第一天,因此不是有效日期。