0

我正在尝试通过 SSIS 派生列转换将百年日期 (HYD) 格式转换为常规日期格式。例如:将 41429 转换为 06/04/2013。我可以通过在脚本中格式化代码来做到这一点(也许我只需要走这条路),但我觉得必须有一种方法可以在我没有得到的派生列中做到这一点。任何帮助表示赞赏。

4

3 回答 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 回答