将自由文本日期值转换为日期数据类型导致转换日期中的未来年份

时间:2013-02-19 09:24:17

标签: sql sql-server-2008-r2

我遇到将自由文本DOB(出生日期)值转换为有效日期数据类型的问题。我正在使用SQL Server 2008 R2。

以下是示例。

当通过SQL的转换函数转换自由文本日期值01/28/48时,它显示2048作为年份,而不是1948,这是未来一年,并且在此不可能出生日期栏。

任何人都可以帮我解决这个问题吗?

以下是我附上的截图,供您快速参考。

enter image description here

2 个答案:

答案 0 :(得分:3)

取自CAST and CONVERT documentation

  

默认情况下,SQL Server根据截止值解释两位数年份   也就是说,两位数的49年被解释为2049年   并且两位数的50年被解释为1950年。许多客户   应用程序(例如基于Automation对象的应用程序)使用截止值   2030年.SQL Server提供两位数年份截止   配置选项,用于更改SQL Server使用的截止年份   并允许一致的日期处理。我们推荐   指定四位数年份。

您可以通过执行以下操作重新配置:

EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE ;
GO
EXEC sp_configure 'two digit year cutoff', 2030 ;
GO
RECONFIGURE;
GO

有关详细信息,请参阅以下文档:

Configure the two digit year cutoff Server Configuration Option


我个人不会重新配置服务器。确保您的数据有4位数年,或者如果您确实需要它们是2位数,因为这些始终是出生日期,如果日期是将来,则删除100年:

DECLARE @dob DATE
SET @dob = CONVERT(DATE, '01/28/48')
IF @dob > GETDATE()
BEGIN
   SET @dob = DATEADD(yy, -100, @dob)
END

答案 1 :(得分:2)

这是SQL Server中的系统范围设置 - “两位数年份截止”。

像这样检查它是什么:

sp_configure 'show advanced options', 1
reconfigure

sp_configure 'two digit year cutoff'

就我而言,我的值为2049 - 任何一年前的任何日期都被视为20xx年(例如48 - > 2048) ,将一年后的日期解释为19xx70 - > 1970)。

因此,您可以为您更改此设置,或者您需要编写自定义T-SQL函数来自行处理此案例(始终将日期转换为19xx个日期 - 无论系统截止日期)

详细了解此主题in this blog post on how to set the two-digit year cutoff