我正在尝试通过 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   回答