SAS日期时间22.3至yymmddn8

时间:2019-01-23 07:25:11

标签: sql sas

我正在使用SAS带来一个位于Microsoft SQL Server中的表,并将其转储到Hadoop中。 我面临的问题是数据变量:INSURANCE_DATE.Week_Start_Date是Datetime 22.3,但是需要转换为yymmddn8。 我要提交3年的数据, 入门代码段:

%let three_year_start =%sysfunc(putn(%sysfunc(intnx(year,%sysfunc(today()),-3)),yymmddn8。))); / * * / %let three_year_end =%sysfunc(putn(%sysfunc(today()),yymmddn8。)); / 是今天 /

工作正常,但我不确定如何格式化 INSURANCE_DATE.Week_Start_Date正确 使我的where子句起作用。

    %let three_year_start=%sysfunc(putn(%sysfunc (                 
    intnx(year,%sysfunc(today()), -3)), yymmddn8.)); /* */
    %let three_year_end=%sysfunc(putn(%sysfunc(today()), yymmddn8.)); /*is 
    today*/
    proc SQL;

      create table BA_INS as

    SELECT  
    format (INSURANCE_DATE.Week_Start_Date) yymmdd10.) as Week_Start_Date

    FROM
      dbo.DIM_INSURANCE_DATE
    WHERE
    (dbo.DIM_INSURANCE_DATE.Week_Start_Date  
    between &three_year_start. and  &three_year_end.);
    quit;

我需要一个解决方案,如如何将datatime 22.3格式转换为yymmdd10。在proc sql查询中

3 个答案:

答案 0 :(得分:0)

如果从SQL Server中提取的源值在SAS中显示为 SAS日期时间值,并且您希望将目标值从SAS推送到Hadoop,就像从 SAS日期值,则可以使用SAS中的datepart函数。

proc sql;
  create table HADOOP.TARGET_TABLE as
  select
  …
  , datepart(Week_Start_Date) as Week_Start_Date format=date9.
  …
  from
    SQLSRV.SOURCE_TABLE
  … 
  ;

我认为实际的日期格式并不重要,只是它是SAS日期格式之一。 SAS / Connect引擎将检查要定位的SAS列,查看日期格式,并自动进行必要的调整,以将SAS日期值作为日期值插入目标系统中。

答案 1 :(得分:0)

使用datepart获取格式,然后应用格式

SELECT  
datepart(INSURANCE_DATE.Week_Start_Date) format= yymmdd10. as Week_Start_Date

答案 2 :(得分:0)

不确定使用宏变量的计划,但是您正在使用额外的%SYSFUNC()调用。您无需调用PUTN()来格式化该值,%SYSFUNC()已经采用了格式说明。

%let three_year_start=%sysfunc(intnx(year,%sysfunc(today()),-3,b),yymmddn8.);
%let three_year_end=%sysfunc(today(), yymmddn8.);

因此,这将为您提供2016010120190123之类的价值。请注意SAS,如果您未将其用引号引起来,则将它们视为数字20,160,101和20,190,123,而不与日期值或日期时间值有关。如果您确实将它们用引号引起来,那么它们将只是字符串。

如果您只想生成一个日期值,则不必理会数字的格式。然后,您将获得THREE_YEAR_START=20454THREE_YEAR_END=21572之类的值,它们代表自1960年以来的天数。然后,可以在SQL代码中使用这些值。但是首先,您需要将datetime值转换为日期值。否则,您将比较苹果和橙子(秒和天)。

%let three_year_start=%sysfunc(intnx(year,%sysfunc(today()),-3,b));
%let three_year_end=%sysfunc(today());
...
where datepart(Week_Start_Date) between &three_year_start and &three_year_end

或者您可以通过设置引号和适当的后缀字母来格式化宏变量,使其看起来像DATE(或DATETIME)格式的值可以理解并将其用作日期(或datetime)文字。

日期文字

%let three_year_start=%sysfunc(intnx(year,%sysfunc(today()),-3,b),date9.);
%let three_year_end=%sysfunc(today(), date9.);
...
where datepart(Week_Start_Date) between "&three_year_start"d and "&three_year_end"d

DATETIME文字

%let three_year_start=%sysfunc(intnx(dtyear,%sysfunc(datetime()),-3,b),datetime19.);
%let three_year_end=%sysfunc(datetime(), datetime19.);
...
where Week_Start_Date between "&three_year_start"dt and "&three_year_end"dt