我有一些周日期-时间格式的数据,即2020年12月14日00:00:00:0000。我正在使用SAS和proc-sql查询
这些数据包含了许多周的数据,但我很好奇是否有办法只提取与本周相关的数据?IE今天是2020年12月17日,所以我只想提取2020年12日14日这一周的数据。如果今天是2020年12月22日,那么我希望它能提取2020年10月21日这一周的数据。
这是我尝试过的众多查询之一。
data have;
today = today();
wkday = weekday(today);
start = today - (wkday - 1);
end = today + (7 - wkday);
length cstart cend $30;
cstart = put(start, date9.) || ' 00:00:00.0000' ;
cend = put(end, date9.) || ' 00:00:00.0000' ;
call symput('start', cstart);
call symput('end', cend);
run;
Proc Sql;
connect to odbc (environment=x user=y p=z);
create table basic.curweek as select * from connection to odbc
(select year, month, week, store, sales, SKU
from datatable
where (&start. <= week <= &end.)
order by sku);
disconnect from odbc;
quit;
多亏了下面伟大的人们的帮助,我来到了这个州。但是我仍然面临一些语法错误。如有任何帮助,我们将不胜感激!!
使用intnx()
将感兴趣的日期时间和今天的日期时间与周初对齐。
proc sql;
create table want as
select *
from table
where intnx('dtweek', date, 0, 'B') = intnx('dtweek', datetime(), 0, 'B')
;
quit;
正如其他人所指出的,如果您使用SQL传递,则需要使用您的"风味";SQL。SAS特定功能将不起作用;今天(("在您使用的SQL中没有任何意义。
我会采取的方法是:
- 在SAS数据步骤中-获取今天的日期
- 使用今天的日期计算一周的开始和结束
- 将开始/结束日期转换为字符串(字符串将取决于日期在sql数据库中的格式-日期或日期时间(
- 使用字符串创建宏变量
- 将宏变量输入到sql直通查询中,以获得所需的子集日期
下面是一些示例代码。它可能不会让你一路走到那里,但会给你更多的想法来尝试。
data have;
today = today(); *** TODAYs DATE ***;
wkday = weekday(today); *** WEEK DAY NUMBER FOR TODAY, POSSIBLE VALUES ARE 1-7 ***;
start = today - (wkday - 1); *** CALCULATE SUNDAY ***;
end = today + (7 - wkday); *** CALCULATE SATURDAY ***;
*** UNCOMMENT AND USE BELOW IF WEEK START/END IS MON-FRI ***;
*start = today - (wkday - 2); *** CALCULATE MONDAY ***;
*end = today + (6 - wkday); *** CALCULATE FRIDAY ***;
*** REPRESENT DATES AS DATE-TIME CHARACTER STRING - SURROUNDED BY SINGLE QUOTES ***;
cstart = "'" || put(start, date9.) || ' 00:00:00.0000' || "'";
cend = "'" || put(end, date9.) || ' 00:00:00.0000' || "'";
*** USE CHARACTER VARIABLES TO CREATE MACRO VARIABLES ***;
call symput('start', cstart);
call symput('end', cend);
run;
*** IN SQL PASS-THRU, USE MACRO VARIABLES IN WHERE STATEMENT TO SUBSET ONE WEEK ***;
Proc Sql
connect to odbc (environment=x user=y p=z);
create table basic.curweek as select * from connection to odbc
(select year, month, week, store, sales, SKU
from datatable
where (&start. <= week and week <= &end.)
order by sku);
disconnect from odbc;
quit;