请停止将日期存储为字符串,尤其是为 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,即使不需要此控件也是如此,以保持一致性(为什么使用@987654336 @ 在某些情况下,CONVERT 在你需要的时候,你什么时候可以一直使用CONVERT?)。
编辑
要识别由于错误的数据类型选择而潜入表中的垃圾数据,请执行以下操作(然后修复数据,或者更好的是,修复数据类型,以免再次发生这种情况):
SET DATEFORMAT DMY;
SELECT date_column FROM dbo.table_name WHERE ISDATE(date_column) = 0;