【问题标题】:SQL Insert Into Statement to pass SAS date to MS Access DBSQL 插入语句以将 SAS 日期传递给 MS Access DB
【发布时间】:2018-07-16 18:46:17
【问题描述】:

我想将 SAS 数据集中的数据附加到 MS Access 数据库中的表中。过去,我使用 SQL INSERT INTO 语句来执行此操作,但在将 SAS 日期字段插入 MS Access 日期/时间字段时遇到了一些问题。这是我在 SAS 程序中尝试做的一个想法:

libname input "c:\Folder";
libname db access 'C:\Folder\database.accdb';

Proc SQL;
Create table tblAccess as
Select distinct field1, field2, DOS
from input.dat1;

PROC SQL;
Insert into db.tblClaims (field1, field2, DOS)
select field1, field2, DOS
from work.tblAccess;

问题在于 DOS 字段在 MS Access 数据库中显示为“1/1/1960 5:52:XX AM”,而不管 DOS 最初是什么。显然,问题在于 SAS 日期作为日期时间输入到 MS Access - SAS 日期 2017 年 12 月 10 日被存储为数字 21163,它作为 21,163 秒插入到 MS Access 数据库中(~ 5 小时 52 分钟)从 1960 年 1 月 1 日开始。换句话说,在此过程中的某个地方,我的日子被视为秒,把一切都扔掉,如果这有意义的话。

但是,虽然我理解了这个问题,但我似乎无法弄清楚如何解决它。或者,我很感激有关其他方法来避免此日期/时间字段问题的处理此任务的建议。据我所知,PROC EXPORT 不起作用,因为导出的 SAS 数据集替换了 MS Access 表并且不能附加到它,至少从我的实验来看是这样。

编辑:SAS 字段是 DATE9。如果相关的话,MS Access 字段是日期/时间。

【问题讨论】:

    标签: sql ms-access sas


    【解决方案1】:

    重新说明 Stack Overflow 的问题帮助我找到了解决方案。如果问题是天正在变成秒,为什么不把它们变回天呢?我在第二个 PROC SQL 语句之前添加了以下 DATA 步骤:

    Data tblAccess;
    set work.tblAccess;
    DOS = DOS*86400;
    Format DOS Datetime9.;
    run;
    

    它似乎已经解决了这个问题。不过,我仍然希望有更好的方法来执行此任务。

    【讨论】:

    • 你似乎把描述倒过来了。您的操作是通过乘以一天中的秒数将天数转换为秒数。等效地,您可以使用时间文字来表示秒数:datetime=date*'24:00:00't; 或者只是 dhms() 函数。
    【解决方案2】:

    SAS 将日期值存储为天数,将日期时间值存储为秒数。您可以使用DHMS() 函数将日期转换为日期时间。 DHMS 代表 Days Hours Minutes Seconds,您可以使用datepart() 函数进行其他方式的转换。

    insert into db.tblClaims (field1, field2, datetime_field)
      select field1, field2, dhms(date_field,0,0,0)
      from work.tblAccess
    ;
    

    【讨论】:

      【解决方案3】:

      首先我要说的是,我对您遇到的确切问题没有经验,但也许有类似的问题。此外,我已经多年没有与sas 认真合作了。

      话虽如此,您很可能想要使用相关日期字段的格式。这样的事情可能起作用:

      Data tblAccess;
      SET work.tblAccess;
      Format DOS YYMMDD10.;
      run;
      

      或者(在 Proc SQL 中):

      Proc SQL;
      Create table tblAccess as
      Select DISTINCT field1, 
          field2, 
          DOS format=YYMMDD10.
      from input.dat1;
      

      我很难确定您需要什么格式,但是通过搜索引擎检查对其他可能格式的一般审查可能会产生您需要的答案(假设这不起作用)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 2016-04-19
        • 1970-01-01
        • 2016-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多