如何在SQL中将日期格式匹配为yyyymmdd

时间:2018-08-30 08:04:08

标签: sql sas type-conversion

我正在研究SAS上的SQL,我想使用“%let”作为日期时间。 我表中日期时间的格式是

  

销售日期

     

2018年8月28日

     

2018年8月29日

但我正在使用

  

%let start_date = 20180828;

     

%let end_date = 20180830;

     

在(&start_date)之间放置(sale_date,yymmddn8。)。和“&end_date”。

我遇到了“数据类型“ sale_date”与定义的类型名称不匹配”的错误。 我该如何解决这个问题?

谢谢

2 个答案:

答案 0 :(得分:1)

如果您使用date,则需要使用日期文字,如下所示

proc sql;
 select * from sashelp.buy
 where date between "01JAN1997"D and "30JAN2007"D ;

宏变量由&而不是%引用。为了使您的代码正常工作,您需要按以下步骤进行更改

%let start_date="01JAN1997"D ;
%let end_date="30JAN2007"D;
proc sql;
 select * from sashelp.buy
where date between &start_date and &end_date ;

答案 1 :(得分:0)

您需要为错误消息显示更多上下文,因为它看起来不像从该代码中得到的错误类型。

您发布的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