[英]sql datetime in sas date format
proc sql noprint;
%let today=%sysfunc(today(),yymmdd10.);
%put &today.;
select
COALESCE(sum(abc.step_sum),0)
into :SumLoans_12m
from
RTDM_ABT.ABT_CONTRACT abc
where abc.CLIENT_ID = "&T_CLIENT_ID"
and abc.CONTRACT_BEGINDATE - &today. <= 360
and abc.DML_FLAG NE 1;
quit;
我知道有必要將CONTRACT_BEGINDATE
(2021-01-14 00:00: 00.000) 轉換為 SAS 格式,我認為這會有所幫助,你是怎么做的? 謝謝你的幫助!
ERROR:
SYMBOLGEN: Macro variable TODAY resolves to 2021-05-18
2021-05-18
SYMBOLGEN: Macro variable T_CLIENT_ID resolves to 00000031-B081-4E97-9437-F20CF874F857
MPRINT(MEQUIBEHSCOREUPRE): select COALESCE(sum(abc.step_sum),0) into :SumLoans_12m from RTDM_ABT.ABT_CONTRACT abc where abc.CLIENT_ID = "00000031-B081-4E97-9437-F20CF874F857" and
abc.CONTRACT_BEGINDATE - today() <= 360 and abc.DML_FLAG NE 1;
175369 1621341661 no_name 0 SQL (503
SQLSRV_39799: Prepared: on connection 0 175370 1621341661 no_name 0 SQL (503
SELECT * FROM rtdm_abt . ABT_CONTRACT 175371 1621341661 no_name 0 SQL (503
175372 1621341661 no_name 0 SQL (503
SAS_SQL: Unable to convert the query to a DBMS specific SQL statement due to an error. 175373 1621341661 no_name 0 SQL (503
ACCESS ENGINE: SQL statement was not passed to the DBMS, SAS will do the processing. 175374 1621341661 no_name 0 SQL (503
嘗試將 datetime 變量與 datetime 值進行比較。 首先讓我們重寫您的表達式以使其更易於編碼。 比較abc.CONTRACT_BEGINDATE - <TODAY> <= 360
與abc.CONTRACT_BEGINDATE <= 360 + <TODAY>
相同。 因此,讓我們創建一個包含該日期時間值的宏變量。
%let now_plus_360_days = %sysfunc(intnx(dtday,%sysfunc(datetime()),360)) ;
然后在表達式中使用該宏變量
and abc.CONTRACT_BEGINDATE <= &now_plus_360_days
proc sql noprint;
select sum(step_sum)
into :SumLoans_12m
from
RTDM_ABT.ABT_CONTRACT abc
where abc.client_id = "&T_CLIENT_ID"
and abc.DML_FLAG <> 1
and datepart(abc.CONTRACT_BEGINDATE) between today() - 365 and today()
;
quit;
它對我有用,雙倍的,我自己想出了它很好))
SAS 日期值是整數,是從紀元01-JAN-1960
開始的天數。
TODAY()
返回一個 SAS 數據值,一個 integer nnnnn
。
您正在將該值格式化為yymdd10.
它產生一個構造yyyy-mm-dd
的字符串。 (該字符串比數據值nnnnn
更易於人類理解。)並將該字符串分配給today
的宏符號。 解析符號后,字符串將作為源代碼插入到您的步驟中。
所以,
abc.CONTRACT_BEGINDATE - &today. <= 360
變成
abc.CONTRACT_BEGINDATE - 2021-05-18 <= 360
您想在構造"dd-mon-yyyy"D
的 SAS 日期文字的上下文中解析宏符號
嘗試
%let today_literal = "%sysfunc(today(),date11.)"D;
%put &=today_literal;
和
abc.CONTRACT_BEGINDATE - &today_literal <= 360
但是,很大程度上取決於您未顯示的RDTM_ABT
的 libname 語句的選項。 您可能需要使用直通 SQL 語句才能獲得所需的結果
connect using RDTM_ABT;
select * from connection to RDTM_ABT
(
... my query in remote database syntax ...
)
您可以使用今天的遠程系統函數,或者使用遠程系統日期文字或字符串到日期轉換函數的適當源代碼構造查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.