我遇到了一个 SQL 片段,包括格式为 6 位的日期转换YYMMDD
。
SELECT CONVERT(DATETIME, '6011' + '01') AS testingdate
为什么后面的查询不产生2060-11-01
而'2011' + '01'
产生2020-11-01
?
我遇到了一个 SQL 片段,包括格式为 6 位的日期转换YYMMDD
。
SELECT CONVERT(DATETIME, '6011' + '01') AS testingdate
为什么后面的查询不产生2060-11-01
而'2011' + '01'
产生2020-11-01
?
正如@Squirrel 评论的那样,解释不明确的 2 位数年份的行为由2 digit year cut-off configuration value控制。该值指定一个 1753 到 9999 之间的整数,表示将两位数年份解释为四位数年份的截止年份,默认配置值为 2049。
下面的代码显示了默认和自定义 2 位数年份截止值的行为。
EXEC sp_configure 'show',1;
RECONFIGURE;
--default behavior: 2-digit years <= 49 use 20 as the century and > 49 use 19
EXEC sp_configure 'two digit year cutoff',2049;
RECONFIGURE;
GO
SELECT CAST('01-01-49' AS date); --2049-01-01
SELECT CAST('01-01-50' AS date); --1950-01-01
GO
----custom behavior: 2-digit years <= 49 use 19 as the century and > 49 use 18
EXEC sp_configure 'two digit year cutoff',1949;
RECONFIGURE;
GO
SELECT CAST('01-01-49' AS date); --1949-01-01
SELECT CAST('01-01-50' AS date); --1850-01-01
GO
----custom behavior: 2-digit years <= 49 use 21 as the century and > 49 use 20
EXEC sp_configure 'two digit year cutoff',2149;
RECONFIGURE;
GO
SELECT CAST('01-01-49' AS date); --2149-01-01
SELECT CAST('01-01-50' AS date); --2050-01-01
GO
--revert to recommended default value
EXEC sp_configure 'two digit year cutoff',2049;
RECONFIGURE;
GO
恕我直言,两位数的年份截止日期是过去短视的编程实践的一种解决方法。我建议遵循参考文档页面中的建议,这样祖先就不会继承 Y2.1K 问题:
为避免日期出现歧义,请始终在数据中使用四位数年份。