我有一个视图,我在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以及如何对它进行排序?
答案 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/yyyy
。 13/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个月的第一天,因此不是有效日期。