我遇到将自由文本DOB
(出生日期)值转换为有效日期数据类型的问题。我正在使用SQL Server 2008 R2。
以下是示例。
当通过SQL的转换函数转换自由文本日期值01/28/48
时,它显示2048
作为年份,而不是1948
,这是未来一年,并且在此不可能出生日期栏。
任何人都可以帮我解决这个问题吗?
以下是我附上的截图,供您快速参考。
答案 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
) ,将一年后的日期解释为19xx
(70
- > 1970
)。
因此,您可以为您更改此设置,或者您需要编写自定义T-SQL函数来自行处理此案例(始终将日期转换为19xx
个日期 - 无论系统截止日期)
详细了解此主题in this blog post on how to set the two-digit year cutoff