1

我有一个视图,其中我有一个在 varchar formet 中有日期的列,dd/MM/yyyy 当我尝试使用 order by 时,它给出了错误

消息 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

4 回答 4

5

因为这对我来说很好:

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.

于 2012-07-11T12:33:23.007 回答
4

set dateformat dmy可能会解决

于 2012-07-11T12:26:11.647 回答
2

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

你可以试试这个:

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

但我找不到用ISDATE(). 以上将取决于 DATEFORMAT设置(可能还有其他我不知道的设置),当CONVERT()函数发现不兼容的日期时,它将失败并出现错误。


如果您无法将日期转换为DATE数据类型,也许您可​​以做的最好的黑客攻击,在处理日期时应该强调这是最好的做法,那就是检查这个:

ISDATE(SUBSTRING(ddate, 7, 4) + SUBSTRING(ddate, 4, 2) + SUBSTRING(ddate, 1, 2))
于 2012-07-11T12:45:30.370 回答
0

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

于 2016-09-07T18:39:54.740 回答