T sql和Proc sql有什么区别

时间:2019-03-08 00:04:00

标签: sas

有人可以帮助我解决问题吗?

sample1:

ReportMonthYear ProductItemCode ClosedDate            PriorMonthCalendarDate
20160331        1234            24Mar2016 0:00:00     20160201

sample2:

ReportMonthYear ProductItemCode OpenDate     ClosedDate  OverDraftExpiryDate
20160229        1234        13Mar2015 0:00:00            28Oct2016 0:00:00
20150930        1234        13Mar2015 0:00:00            28Oct2016 0:00:00
20151130        1234        13Mar2015 0:00:00            28Oct2016 0:00:00
20150731        1234        13Mar2015 0:00:00            28Oct2016 0:00:00
20150831        1234        13Mar2015 0:00:00            28Oct2016 0:00:00
20160131        1234        13Mar2015 0:00:00            28Oct2016 0:00:00
20160331        1234        13Mar2015 0:00:00 24Mar2016 0:00:00  
20151231        1234        13Mar2015 0:00:00            28Oct2016 0:00:00
20151031        1234        13Mar2015 0:00:00            28Oct2016 0:00:00

使用T-SQL而不是使用Proc SQL时,我得到正确的结果。

需要的输出:

ProductItemCode ReportMonthYear  PriorMonthCalendarDate  ClosedDate               OverDraftExpiryDate  earlyclosuremonths
            1234                     20160331                  20160229                            2016-03-24 00:00:00  28Oct2016 0:00:00    7

T sql中的代码:

select 
cd.ProductItemCode,
cd.ReportMonthYear,
cd.PriorMonthYear,
cd.ClosedDate,
df.OverDraftExpiryDate,
datediff(m,cd.ClosedDate,OverDraftExpiryDate) EarlyClosureMonths
from
sample1 cd
inner join sample2 df
on cd.ProductItemCode = df.ProductItemCode
and cd.PriorMonthYear = df.ReportMonthYear

Proc sql中的代码;

proc sql;
select 
cd.ProductItemCode,
cd.ReportMonthYear,
cd.PriorMonthCalendarDate,
cd.ClosedDate,
df.OverDraftExpiryDate,
intck('month',cd.ClosedDate,df.OverDraftExpiryDate) as EarlyClosureMonths
from
sample1 cd
inner join sample2 df
on cd.ProductItemCode = df.ProductItemCode
and cd.PriorMonthCalendarDate = df.ReportMonthYear;
quit;

1 个答案:

答案 0 :(得分:1)

看起来您的“日期”变量实际上具有日期时间值而不是日期值。日期存储为自1960年以来的天数,而日期时间存储为秒数。

如果您以秒为单位而不是几天来计算月份,您将得到错误的答案。请改用dtmonth间隔。

intck('dtmonth',cd.ClosedDate,df.OverDraftExpiryDate) as EarlyClosureMonths

或将日期时间值转换为日期并使用月间隔。

intck('month',datepart(cd.ClosedDate),datepart(df.OverDraftExpiryDate)) as EarlyClosureMonths