我正在尝试通过SSIS派生列转换将百年日期(HYD)格式转换为常规日期格式。例如:转换41429 到2013年4月6日。我可以在脚本中使用formatinng代码来完成它(也许我只需要走这条路线)但是我觉得必须有一种方法可以在派生列中这样做,我只是没有得到。任何帮助表示赞赏。
答案 0 :(得分:1)
这就是我想出的。你确定你的转换是正确的吗?我的回答是1天。关闭。
DECLARE @t1 as date = '01/01/1900';
DECLARE @t2 as DATE = '12/31/1900';
DECLARE @hyd as INT;
- 此示例显示我们需要添加1 SELECT @hyd = DATEDIFF(d,@ t1,@ t2)+ 1 - 364 + 1 选择@hyd
set @t2 = '06/04/2013';
SELECT @hyd = DATEDIFF (d,@t1, '06/04/2013') + 1-- 41427
SELECT @hyd
SELECT DATEADD (d, @hyd, '01-JAN-1900')
SELECT DATEADD (d, 41429, '01-JAN-1900')
答案 1 :(得分:0)
百年日期是根据1899-12-31以来的天数计算的。这是一个“Excel事”。它还有一个bug,你必须考虑到它。
等效的TSQL逻辑将是
DECLARE
@HYD int = 41429;
SELECT
@HYD =
CASE
WHEN @HYD > 60
THEN @HYD -1
ELSE
@HYD
END;
SELECT
DATEADD(d, @HYD, '1899-12-31') AS HYD;
使用该公式,我可以在派生列转换中编写以下表达式(假设您有一个名为HYD
的列)
(HYD > 60) ? DATEADD("d",HYD - 1,(DT_DATE)"1899-12-31") : DATEADD("d",HYD,(DT_DATE)"1899-12-31")
结果
答案 2 :(得分:0)
--or inline SQL...using this
SELECT
case when ([HYD] > 60) then
DATEADD(day,[HYD] - 1,'1899-12-31')
else
DATEADD(day,[HYD],'1899-12-31')
end 'HYD_conv'
FROM
TableName
--and in the where clause if you like...
WHERE
(case when ([HYD] > 60) then DATEADD(day,[HYD] - 1,'1899-12-31') else DATEADD(day,[HYD],'1899-12-31') end) = '2016-01-14'