我正在尝试通过 SSIS 派生列转换将百年日期 (HYD) 格式转换为常规日期格式。例如:将 41429 转换为 06/04/2013。我可以通过在脚本中格式化代码来做到这一点(也许我只需要走这条路),但我觉得必须有一种方法可以在我没有得到的派生列中做到这一点。任何帮助表示赞赏。
问问题
3051 次
3 回答
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 SELECT @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')
于 2013-06-04T22:19:02.117 回答
0
一百年日期是根据自 1899 年 12 月 31 日以来的天数计算得出的。这是一个“Excel的东西”。它还有一个你必须考虑的错误。
等效的 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")
和结果
于 2013-06-05T18:40:20.223 回答
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'
于 2016-02-04T01:23:19.647 回答