2

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

dd/mm/yyyy hh:mm

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

消息 242,级别 16,状态 3,第 1 行
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

4

1 回答 1

14

请停止将日期存储为字符串,尤其是 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);

在很大程度上,我更喜欢为您提供的附加控件,并且几乎单方面更改toCONVERT的所有实例,即使不需要此控件,以保持一致性(为什么在某些情况下使用,以及何时需要它,当您可以总是使用?)。CASTCONVERTCASTCONVERTCONVERT

编辑

要识别由于错误的数据类型选择而潜入表中的垃圾数据,请执行此操作(然后修复数据,或者更好的是修复数据类型,以免再次发生这种情况):

SET DATEFORMAT DMY;
SELECT date_column FROM dbo.table_name WHERE ISDATE(date_column) = 0;
于 2013-03-07T16:01:39.113 回答