我在SQL中有一个表示日期的值,但它的类型为nvarchar。日期的值采用以下格式:
dd/mm/yyyy hh:mm
我需要通过DATETIME
格式的CCure 800数据库查看此列。我希望使用CAST
/ CONVERT
;但是,使用它时,会返回以下错误:
Msg 242,Level 16,State 3,Line 1
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。
答案 0 :(得分:11)
请停止将日期存储为字符串,并将特别是存储为Unicode字符串。您是否担心我们日历的某些未来版本会有变音符号,英镑符号,象形文字或普通话而不是数字?
将日期存储为日期。这就是那些数据类型的用途。除了不必担心无效的解释之外,您还可以获得DATEPART
和DATEADD
之类的所有好处,而且您不必担心任何人在列中填充废话(任何事情)从31/02/2012
到'I don''t want to enter a real date'
...
与此同时,您只需要使用带有CONVERT
的样式编号(这对CAST
无效):
SELECT CONVERT(DATETIME, '13/06/2013 09:32', 103);
要使其与CAST
一起使用,您可以相应地设置LANGUAGE
或DATEFORMAT
设置,但不能在视图中执行此操作,这会使代码变得非常脆弱无论如何恕我直言。
SET DATEFORMAT DMY;
SELECT CAST('13/06/2013 09:32' AS DATETIME);
或者
SET LANGUAGE BRITISH;
SELECT CAST('13/06/2013 09:32' AS DATETIME);
我非常喜欢额外的控件CONVERT
为您提供,并且几乎单方面将CAST
的所有实例更改为CONVERT
,即使不需要此控件,一致性(为什么在某些情况下使用CAST
,在需要时使用CONVERT
,何时只能使用CONVERT
?)。
修改强>
要识别由于数据类型选择错误导致进入您的表的垃圾数据,请执行此操作(然后修复数据,或者更好地修复数据类型,以便不再发生这种情况):
SET DATEFORMAT DMY;
SELECT date_column FROM dbo.table_name WHERE ISDATE(date_column) = 0;