我试图对此进行一些研究,但没有太多运气。
我有一个日期(MMDDYY格式)存储在varchar
字段(DateValue)中的表中,该表看起来与此类似:
----------------------
|| ID | DateValue ||
----- -----------
|| 1 | 011212 ||
|| 2 | 011549 ||
|| 3 | 070860 ||
我正在尝试将另一列ConvertDateValue
添加到同一个表中,该表将是date
字段。此列中的值将以此格式(YYYY-MM-DD)从DateValue
字段转换为值。这是我尝试过的:
--declare table variable
declare @tableA table (ID int, DateValue varchar(50))
--insert sample values into table variable
insert into @tableA VALUES
(1,'011212'),
(2,'011549'),
(3,'070860')
begin
select ID,
DateValue,
CAST(STUFF(STUFF(DateValue, 3, 0, '-'), 6, 0, '-') as date) as ConvertDateValue
from @tableA
end
输出:
|| ID | DateValue || ConvertedDateValue ||
----- ----------- ------------------
|| 1 | 011212 || 2012-01-12 ||
|| 2 | 011549 || 2049-01-15 ||
|| 3 | 070860 || 1960-07-08 ||
预期输出:
|| ID | DateValue || ConvertedDateValue ||
----- ----------- ------------------
|| 1 | 011212 || 2012-01-12 ||
|| 2 | 011549 || 2049-01-15 ||
|| 3 | 070860 || 2060-07-08 || --Here is the difference
我需要确保ConvertedDateValue
显示正确的世纪。对于某些数据,上述值也可能是1960-07-08
,而对于其他数据则不是。
仅供参考,我知道两年截止日期选项,我们有默认值 设定的值,即年
2049
。不幸的是,由于各种原因,我不允许更改任何高级选项设置。
我愿意接受反馈,有什么替代方案吗?提前谢谢!
答案 0 :(得分:1)
这非常棒,这是解决它的子字符串:
select convert(date, cast(substring(DateValue,1,2) + '/' + substring(DateValue,3,2) + '/20' + substring(DateValue,5,2) as datetime), 101 ) as converteddate
转换并不是填充数据库所必需的,但它是您要求的格式。
答案 1 :(得分:0)
只需手动解析日期并使用CASE语句来确定世纪。如果你想要' 070860'有时候是2060-07-08,有时候是1960-07-08那么除了两位数的年份你还有什么逻辑可以确定世纪呢?
|| ID | DateValue || ConvertedDateValue ||
----- ----------- ------------------
|| 1 | 011212 || 2012-01-12 ||
|| 2 | 011549 || 2049-01-15 ||
|| 3 | 070860 || 2060-07-08 ||
cd
gem install bundler