簡體   English   中英

sql 日期時間 sas 日期格式

[英]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> <= 360abc.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM