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

问题描述 投票:0回答:2

我在 SQL 中有一个代表日期的值,但它的类型为 nvarchar。日期值的格式为:

dd/mm/yyyy hh:mm

我需要通过 CCure 800 数据库的视图以

DATETIME
格式呈现此专栏。我希望使用
CAST
/
CONVERT
;但是,使用此方法时,会返回以下错误:

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

sql sql-server-2008 t-sql
2个回答
17
投票

请停止将日期存储为字符串,尤其是存储为 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 列中导入混乱的数据时,您可能会遇到多种格式。

0
投票
例如美国和英国的日期时间不兼容。

几个带有 null 测试的 try_converts 可能就足够了。 美国默认无款式编号,英国默认款式编号=103。 [DateOrdered] 是正在转换的列。

SET DATEFORMAT DMY; SELECT date_column FROM dbo.table_name WHERE ISDATE(date_column) = 0;


© www.soinside.com 2019 - 2024. All rights reserved.