2017-08-14 99 views
0

我輸入表這種結構:與起始日期間填充天添加列日期和結束日期

acct_id pvt_data_id pvt_pref_ind start_dttm end_dttm load_dttm pr_load_time 
4174878 26 Y 20101126144142 99991231235959 20170527000000 2017052700 
4174878 26 Y 20101126144142 99991231235959 20170528000000 2017052800 
4174878 26 Y 20101126144142 99991231235959 20170530000000 2017053000 
3212472 26 X 20131016144142 99991231235959 20170531000000 2017053100 
4174878 26 Y 20101126144142 99991231235959 20170601000000 2017060100 
3212472 26 X 20091201142148 99991231235959 20170602000000 2017060200 

林應該採取此表並創建一個新的額外的列pr_day,這將有整數值一天(例如20170814)的範圍在start_dttmend_dttm之間,因此該範圍內每天都會有一行。
我開始與以下查詢來獲取對每個組(由第一3列)的範圍

select 
acct_id, 
pvt_data_id, 
pvt_pref_ind, 
cast(min(substr(cast(start_dttm as string),1,8)) as bigint), 
max(case when end_dttm=99991231235959 then cast(from_unixtime(unix_timestamp(now()),'yyyyMMdd') as bigint) when end_dttm is null then cast(from_unixtime(unix_timestamp(now()),'yyyyMMdd') as bigint) else end_dttm end) 

from table1 
group by acct_id, pvt_data_id,pvt_pref_ind 

注意:值99991231235959或null表示當天應作爲END_DATE。
現在我不知道如何繼續,尋找指導我做一個交叉連接來填充日期,但我應該加入表中的什麼?

所需的輸出會是這樣的:

acct_id pvt_data_id pvt_pref_ind start_dttm end_dttm load_dttm pr_load_time pr_day 
4174878 26 Y 20101126144142 99991231235959 20170527000000 2017052700 20101126 
4174878 26 Y 20101126144142 99991231235959 20170528000000 2017052800 20101127 
4174878 26 Y 20101126144142 99991231235959 20170529000000 2017052900 20101128 
4174878 26 Y 20101126144142 99991231235959 20170530000000 2017053000 20101129 
3212472 26 X 20131016144142 99991231235959 20170531000000 2017053100 20091202 
4174878 26 Y 20101126144142 99991231235959 20170601000000 2017060100 20101130 
3212472 26 X 20091201142148 99991231235959 20170602000000 2017060200 20091201¨ 

感謝的提示和幫助。

回答

0

我認爲最簡單的方法是創建一個列出所有日期的工作表,然後將您的原始表連接到該工作表。在堆棧溢出文章here中討論獲取兩個日期之間的日期列表,我們只需稍微調整即可使其適用於您。對於答案的緣故,我會假設你打算創建一個新的表,所以我會選擇的結果到一個臨時表,你可以改變是你的輸出表:

DECLARE @Date1 DATE, @Date2 DATE 
SET @Date1 = (select left(min(start_dttm), 8) from Your_Table) --'20150528' 
SET @Date2 = getdate() 

SELECT CONVERT(VARCHAR(8), DATEADD(DAY,number,@Date1), 112) + '000000' as [LongDate] 
, CONVERT(VARCHAR(8), DATEADD(DAY,number,@Date1), 112) [Shortdate] 
FROM master..spt_values 
WHERE type = 'P' 
AND DATEADD(DAY,number,@Date1) <= @Date2 

然後你只需加入針對您的原始表中的新的日期範圍表上的條款之間使用短日期值來填充柱的長日期值,是這樣的:

#daterange.longdate between YourTable.start_dttm and YourTable.end_dttm 

希望幫助,爲我提供

+0

感謝,我測試它並讓你知道! –

相關問題