我正在使用SAS上的SQL,我想在日期时使用“%let”。我表中日期时间的格式是
发售日期
28AUG2018
29AUG2018
但我正在使用
%let start_date = 20180828;
%let end_date = 20180830;
WHERE把(sale_date,yymmddn8。)放在“&start_date”之间。和“&end_date。”
我收到错误“数据类型”sale_date“与定义的类型名称不匹配”。我该如何解决这个问题?
谢谢
如果您有使用日期,则需要使用必须使用的日期文字,如下所示
proc sql;
select * from sashelp.buy
where date between "01JAN1997"D and "30JAN2007"D ;
宏变量由&not%引用。要使代码正常工作,您需要按如下方式进行更改
%let start_date="01JAN1997"D ;
%let end_date="30JAN2007"D;
proc sql;
select * from sashelp.buy
where date between &start_date and &end_date ;
您需要为错误消息显示更多上下文,因为它看起来不像您从该代码中获得的错误类型。
您发布的WHERE
语句应该有效,因为您将SALE_DATE
转换为yyyymmdd形式的字符串,并将其与其他字符串进行比较。请注意,如果您的变量SALE_DATE
在ddMONyyyy中显示值,那么它可能具有DATE值(天数)而不是DATETIME值(秒数)。以这种方式显示DATETIME值的唯一方法是,如果您的变量附加了DTDATE9.
格式。另一种可能性是SALE_DATE
实际上是一个字符变量而不是任何类型的数值。
如果SALE_DATE
确实是日期时间值,那么您将需要使用DATEPART()
函数将其转换为日期值以应用YYMMDDN8。格式化。
WHERE put(datepart(sale_date), yymmddn8.) between "&start_date." and "&end_date."
要输入日期文字,您需要一个带引号的字符串,后跟字母d
。值必须采用DATE
信息可以读取的格式。所以像"28AUG2018"d
。然后你可以将它们与变量进行比较,而不必先将其转换。
%let start_date=28AUG2018;
%let end_date=30AUG2018;
WHERE sale_date between "&start_date."d and "&end_date."d
或者,如果变量确实是DATETIME,那么请使用datetime文字。
WHERE sale_date between "&start_date:00:00"dt and "&end_date:23:59"dt