2013-10-28 75 views
0

我有一個很大的數據庫。那裏有合同開始日期。問題是,在一段時間之前,有幾個值作爲日期時間格式導入,其餘的只是date9。結果現在一些sql查詢或數據查詢顯示奇怪的結果,因爲看到存儲在合同開始日期後面的「數字」有所不同。SAS中的DateTime問題

像我想要得到max(contract_start_date)(通過SQL,例如)我會得到***************,而不是正常的結果。

我的問題是我該如何統一這種格式的差異?我最終想要創建一個統一格式的新變量,然後用新的變量替換現有的合同開始日期。

+0

您的數據仍然存在,只是沒有正確打印。 –

+0

它不是真的,因爲整數表示在相同的日期會有很大的不同,但是它們被存儲爲日期時間和日期。例如,如果您使用Year函數,那麼您將會得到錯誤的結果。 – Astro

回答

0
%let d_breakpoint=%sysfunc(putn('31dec2015'D, 13. -L)); 

%put &d_breakpoint; 
%put %sysfunc(putn(&d_breakpoint, DATETIME. -L)); 

data indata; 
    format contract_start_date date9.; 
    do i=0 to 40; 
     contract_start_date = i*5000; 
     output; 
    end; 
    drop i; 
run; 

proc sql; 
alter table indata add d_contract_start num format=date9. 
; 
update indata 
    set d_contract_start= case when contract_start_date > &d_breakpoint then contract_start_date/(24*60*60) 
           else contract_start_date end 
; 
quit; 

proc sql; 
select 
     min(d_contract_start) format=date9. as min 
    , max(d_contract_start) format=date9. as max 
    from indata 
; 
quit; 

可變僅具有一個格式,但不對應於該格式存儲在表中的變量的值中的一個部分 - 如果格式爲DATE值(日期作爲自1jan1960的天數),但一些記錄存儲DATETIME值(自Janjan1960午夜以來的秒數),結果不正確。

因此,您需要將值修改爲只有一種類型 - DATE或DATETIME。上面的代碼會將其更改爲DATE值。

想法是定義一個斷點值 - 高於該值的值將被視爲DATETIME值,其餘值將被視爲DATE值,並將保持這樣的狀態。

在我的例子中,我選擇了31dec2015(即20453)的DATE值作爲斷點。所以這代表31dec2015作爲DATE,而01JAN60:05:40:53代表DATETIME。 低於20453的值被認爲是DATE值,高於20453的值被認爲是DATETIME值。

+0

我基於這樣的事實得出類似的解決方案,如果您從日期時間開始使用Year函數,它幾乎可以在1960年左右返回值。 – Astro