в чем разница между T sql и Proc sql - PullRequest
0 голосов
/ 08 марта 2019

Может кто-нибудь помочь мне с решением?

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 Ответ

1 голос
/ 08 марта 2019

Похоже, что ваши переменные "date" на самом деле имеют значения datetime вместо значений date. Даты хранятся в виде количества дней с 1960 года, а даты - в виде количества секунд.

Если вы вычисляете месяцы по значениям в секундах, а не в днях, вы получите неправильный ответ. Вместо этого используйте интервал dtmonth.

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

Или конвертируйте значения даты и времени в даты и используйте интервал месяца.

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