我面临将自由文本DOB
(出生日期)值转换为有效日期数据类型的问题。我正在使用 SQL Server 2008 R2。
以下是示例。
01/28/48
当通过 SQL 的转换函数转换自由文本日期值时,它显示2048
为年份而不是1948
未来年份,并且在此出生日期列中是不可能的。
谁能帮我摆脱这个问题?
以下是我附上的屏幕截图,供您快速参考。
我面临将自由文本DOB
(出生日期)值转换为有效日期数据类型的问题。我正在使用 SQL Server 2008 R2。
以下是示例。
01/28/48
当通过 SQL 的转换函数转换自由文本日期值时,它显示2048
为年份而不是1948
未来年份,并且在此出生日期列中是不可能的。
谁能帮我摆脱这个问题?
以下是我附上的屏幕截图,供您快速参考。
默认情况下,SQL Server 根据截止年份 2049 解释两位数年份。也就是说,两位数年份 49 被解释为 2049,两位数年份 50 被解释为 1950。许多客户端应用程序,例如那些基于自动化对象,使用截止年份 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
有关详细信息,请参阅以下文档:
我个人不会重新配置服务器。要么确保您的数据有 4 位数年份,或者如果您真的需要它们是 2 位数,因为这些总是出生日期,如果日期在未来,请删除 100 年:
DECLARE @dob DATE
SET @dob = CONVERT(DATE, '01/28/48')
IF @dob > GETDATE()
BEGIN
SET @dob = DATEADD(yy, -100, @dob)
END
这是 SQL Server 中的系统范围设置 - “两位数年份截止值”。
像这样检查它是什么:
sp_configure 'show advanced options', 1
reconfigure
sp_configure 'two digit year cutoff'
就我而言,我得到的值是2049
- 任何前一年的日期都被认为是20xx
一年(例如48
-> 2048
),之后一年的日期被解释为19xx
(70
-> 1970
)。
因此,您可以为您更改此设置,或者您需要编写一个自定义 T-SQL 函数来自己处理这种情况(始终将日期转换为19xx
日期 - 无论系统截止日期如何)
在这篇关于如何设置两位数年份截止日期的博客文章中查看有关此主题的更多信息