【问题标题】:SAS Proc SQL dateadd functionSAS Proc SQL dateadd 函数
【发布时间】:2014-11-20 01:59:43
【问题描述】:

我正在尝试在 proc SQL 中使用 SAS 中的一些 SQL 代码。 SQL Server 中的原始代码可以正常工作。

case 
when entry_stamp between '2011-10-29 21:00:00.000' and '2011-11-06 02:00:00.000' 
    then dateadd(hour, 5, cast(convert (char(16), entry_stamp, 121) as datetime))  

... ... else dateadd(hour, 6, cast(convert (char(16), entry_stamp, 121) as datetime)) end ,

我在 121 的括号中收到语法错误。稍微搜索一下表明 proc SQL 不支持 dateadd?

谢谢。

错误 22-322:语法错误,应为以下之一:!、!!、&、、*、+、-、/、、=、 >, >=, ?, AND, BETWEEN, CONTAINS, ELSE, END, EQ, EQT, GE, GET, GT, GTT, IN, IS, LE, LET, LIKE, LT, LTT, NE, NET, NOT, NOTIN, OR, WHEN, ^, ^=, |、||、~、~=。

【问题讨论】:

  • 请注意,SAS 将日期时间存储为整数秒,因此添加一个小时只是将 3600 添加到日期时间(并且无需担心类型转换)。

标签: sql sas dateadd


【解决方案1】:
data _null_;
   /* The following statement creates expected results. */
   date1=intnx('dtday','01aug11:00:10:48'dt,1);
    /* The following two statements create unexpected results. */
   date2=intnx('dtday','01aug11'd,1);
   date3=intnx('dtday','01aug11:00:10:48'd,1);
   put 'Correct Datetime Value   ' date1= datetime19. /
   'Incorrect Datetime Value ' date2= datetime19. /
   'Incorrect Datetime Value ' date3= datetime19.;
   run;
SAS writes the following output to the log:
  Correct Datetime Value   date1=02AUG2011:00:00:00
  Incorrect Datetime Value date2=02JAN1960:00:00:00
  Incorrect Datetime Value date3=02JAN1960:00:00:00

To ensure correct results with interval functions, use date intervals with date values 
and datetime intervals with datetime values.
SAS does not return an error message if you use a date value with a datetime interval, 
but the results are incorrect.

【讨论】:

    【解决方案2】:

    SAS 中的 PROC SQL 符合 ANSI,这就是您遇到 DATEADD 问题的原因。

    如果您不执行直通查询(例如,您正在处理 SAS 数据集),您可以使用 INTNX 函数。

    当您尝试增加小时数时,您需要以下内容:

    format hours datetime20.;
    hours=intnx('hour', '01FEB2010:00:00:00'dt, 1, 'same'); 
    

    结果是:

    小时= 01FEB2010:01:00:00(下一小时)

    【讨论】:

    • INTNX 很好,但您需要包含第四个参数 's' 以保持相同的对齐方式 - 默认情况下它将递增到下一小时的开始,因此 intnx('hour','01FEB2010:00:15:00'dt,1) 将变为'01FEB2010:01:00:00'dt 不是 '01FEB2010:01:15:00'dt`。
    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多