【问题标题】:SAS PROC SQL; - creating DateTime variableSAS 过程 SQL; - 创建日期时间变量
【发布时间】:2018-11-13 10:10:26
【问题描述】:

我正在尝试通过在 PROC SQL 中连接 DATE 变量(DATE 格式)和 time 变量(字符串 hh:mm:ss)来创建过去 3 小时的日期时间变量;

非常感谢您对此的任何帮助!

例子:

APPLCTN_DT  =  05NOV2018:00:00:00.000 
APPLCTN_TM  =  20:04:57

我想根据以上内容创建一个数字DATETIME 字段

【问题讨论】:

  • 您的问题不清楚。您是想生成一个字符变量,还是想要一个可与 SAS 日期和时间函数一起使用的数字变量?请编辑您的问题以包含一些示例输入和所需的输出数据。
  • 请将数据发布为文本,而不是图像。
  • 日期变量值似乎是在数据库中找到的表示形式(那些 0 代表时间部分)。您的代码是否针对远程数据库中的表运行?
  • 看起来您已经有一个日期时间值,而不是日期值,但它的时间部分为零。

标签: sql datetime sas proc


【解决方案1】:

由于看起来您的“日期”变量实际上是一个零时间的 DATETIME 变量,您也许可以只添加时间部分?

new_datetime =  APPLCTN_DT + input(APPLCTN_TM,time8.);

或者为了安全起见,您可以在添加时间部分之前强制日期时间值的时间部分为零。这里有几种方法。

new_datetime =  dhms(datepart(APPLCTN_DT),0,0,input(APPLCTN_TM,time8.));
new_datetime =  intnx('dtdate',APPLCTN_DT,0) + input(APPLCTN_TM,time8.);

【讨论】:

    【解决方案2】:

    假设 _DT 变量实际上是一个没有确切时间部分的日期时间值(因此只有日期)。

    使用DATEPART 提取SAS 日期值,INPUT 将时间字符串转换为时间值,DHMS 构造目标日期时间值,INTNX 计算与目标的新日期时间值偏移量。

    data _null_;
      APPLCTN_DT  =  '05NOV2018:00:00:00.000'dt ;
      APPLCTN_TM  =  "20:04:57";
    
      date_part = datepart(applctn_dt);
      time_part = input(applctn_tm,time8.);
    
      target_dt = dhms(date_part,0,0,0) + time_part;
    
    
      target_minus_3hr_dt = intnx ('dthour'
        , dhms(date_part,0,0,0) + time_part
        , -3
      );
    
      target_minus_3hr_exact_dt = intnx ('dtsecond'
        , dhms(date_part,0,0,0) + time_part
        , -3*60*60
      );
    
    
      format target: datetime20.;
    
      put target_dt ' combined';
      put target_minus_3hr_dt ' combined, 3 hours ago';
      put target_minus_3hr_exact_dt ' combine, exactly three hours ago (to the second)';
    run;
    

    将显示在日志中

    05NOV2018:20:04:57  combined
    05NOV2018:17:00:00  combined, 3 hours ago
    05NOV2018:17:04:57  combine, exactly three hours ago (to the second)
    

    【讨论】:

      【解决方案3】:

      实际上,您的代码接近结果,我认为您忘记将 SAS 日期格式转换为显示格式。

      在变量 target_minus_3hr_dt 和 target_minus_3hr_exact_dt 中使用 put 函数, 由于 SAS 日期显示为数字,所以我们需要使用 put 函数来传输。

       data _null_;
      APPLCTN_DT  =  '05NOV2018:00:00:00.000'dt ;
      APPLCTN_TM  =  "20:04:57";
      
      date_part = datepart(applctn_dt);
      time_part = input(applctn_tm,time8.);
      
      target_dt = put(date_part,date9.)||applctn_tm;
      
      
      target_minus_3hr_dt = put((intnx ('dthour'
        , dhms(date_part,0,0,0) + time_part
        , -3
      )),datetime20.);
      
      target_minus_3hr_exact_dt = put((intnx ('dtsecond'
        , dhms(date_part,0,0,0) + time_part
        , -3*60*60
      )),datetime20.);
      
      
      put target_dt ' combined';
      put target_minus_3hr_dt ' combined, 3 hours ago';
      put target_minus_3hr_exact_dt ' combine, exactly three hours ago (to the second)';
      run;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-15
        • 2014-08-13
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 2014-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多