ssis派生列中的百年日期转换

时间:2013-06-04 17:43:44

标签: ssis

我正在尝试通过SSIS派生列转换将百年日期(HYD)格式转换为常规日期格式。例如:转换41429  到2013年4月6日。我可以在脚本中使用formatinng代码来完成它(也许我只需要走这条路线)但是我觉得必须有一种方法可以在派生列中这样做,我只是没有得到。任何帮助表示赞赏。

3 个答案:

答案 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")

enter image description here

结果

enter image description here

答案 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'