2013-10-28 45 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