将英国格式日期转换为日期时间

时间:2013-03-07 15:59:41

标签: sql sql-server-2008 tsql

我在SQL中有一个表示日期的值,但它的类型为nvarchar。日期的值采用以下格式:

dd/mm/yyyy hh:mm

我需要通过DATETIME格式的CCure 800数据库查看此列。我希望使用CAST / CONVERT;但是,使用它时,会返回以下错误:

  

Msg 242,Level 16,State 3,Line 1
  将varchar数据类型转换为日期时间数据类型会导致超出范围的值。

1 个答案:

答案 0 :(得分:11)

请停止将日期存储为字符串,并将特别是存储为Unicode字符串。您是否担心我们日历的某些未来版本会有变音符号,英镑符号,象形文字或普通话而不是数字?

将日期存储为日期。这就是那些数据类型的用途。除了不必担心无效的解释之外,您还可以获得DATEPARTDATEADD之类的所有好处,而且您不必担心任何人在列中填充废话(任何事情)从31/02/2012'I don''t want to enter a real date' ...

与此同时,您只需要使用带有CONVERT的样式编号(这对CAST无效):

SELECT CONVERT(DATETIME, '13/06/2013 09:32', 103);

要使其与CAST一起使用,您可以相应地设置LANGUAGEDATEFORMAT设置,但不能在视图中执行此操作,这会使代码变得非常脆弱无论如何恕我直言。

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;