我正在使用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查询中
答案 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.);
因此,这将为您提供20160101
和20190123
之类的价值。请注意SAS,如果您未将其用引号引起来,则将它们视为数字20,160,101和20,190,123,而不与日期值或日期时间值有关。如果您确实将它们用引号引起来,那么它们将只是字符串。
如果您只想生成一个日期值,则不必理会数字的格式。然后,您将获得THREE_YEAR_START=20454
和THREE_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