我在 SQL 中有一个代表日期的值,但它的类型为 nvarchar。日期值的格式为:
dd/mm/yyyy hh:mm
我需要通过 CCure 800 数据库的视图以
DATETIME
格式呈现此专栏。我希望使用 CAST
/CONVERT
;但是,使用此方法时,会返回以下错误:
消息 242,第 16 级,状态 3,第 1 行
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
请停止将日期存储为字符串,尤其是存储为 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
在 varchar 列中导入混乱的数据时,您可能会遇到多种格式。
几个带有 null 测试的 try_converts 可能就足够了。 美国默认无款式编号,英国默认款式编号=103。 [DateOrdered] 是正在转换的列。
SET DATEFORMAT DMY;
SELECT date_column FROM dbo.table_name WHERE ISDATE(date_column) = 0;