Vik*_*kky 1 sql sql-server-2008-r2
我有一个视图,我有一个日期为 varchar 格式的列,dd/MM/yyyy
当我尝试使用 order by 时,它给出了错误
消息 241,级别 16,状态 1,第 2 行 从字符串转换日期和/或时间时转换失败。
查询是
select * from test1.dbo.abcd order by CONVERT(date,ddate,103)
Run Code Online (Sandbox Code Playgroud)
它返回 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
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么它返回 0 以及如何对其进行排序?
因为这对我来说很好用:
SELECT CONVERT(date,'13/01/2010',103);
Run Code Online (Sandbox Code Playgroud)
尝试:
ORDER BY CONVERT(DATE, LEFT(ddate, 10), 103);
Run Code Online (Sandbox Code Playgroud)
我怀疑发生的情况是推送到您的视图中的数据具有您看不到的尾随字符(例如回车符)或非打印字符。您可以通过以下方式检查超过 10 个字符的值:
SELECT ... WHERE LEN(ddate) > 10
Run Code Online (Sandbox Code Playgroud)
如果这仍然不起作用,那么也许数据真的很糟糕,例如可能是:
13/O1/2010
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您真正可以做的唯一一件事就是推回表/视图的所有者以首先获取正确的数据,或者尝试使用以下方法过滤掉:
SET DATEFORMAT DMY;
...
WHERE ISDATE(ddate) = 1
Run Code Online (Sandbox Code Playgroud)
至于您问题中的标题,ISDATE在这种情况下返回 0,因为默认情况下这不是日期 - 在大多数情况下,SQL Server 是使用美国英语和 MDY 日期格式设置的,因此它需要格式为mm/dd/yyyy. 13/01/2010是 2010 年的第 13 个月的第一天。我的记忆是粗略的,但我确定那年没有第 13 个月。
正如其他人所建议的那样,真正的解决方法是将您的数据存储为日期/时间,而不是字符串,并以明确的格式传递字符串文字,例如YYYYMMDD.