在SAS中的SQL表中插入日期/时间

时间:2014-11-05 18:06:10

标签: sql sas

我在SAS EG中将日期时间插入数据库表名(TestTable)时遇到了一些问题。 TestTable中的日期字段定义为

Name = EnteredDate  
Type = Date
Length = 8
Format = DATETIME22.3
Informat = DATETIME22.3

Name = LastUpdateDate  
Type = Date
Length = 8
Format = DATETIME22.3
Informat = DATETIME22.3

我现有的代码如下,其中我使用select语句来插入而不是使用values语句。这里调用一个我根本不使用的PrepTable,但是select语句允许我使用datetime()函数,该函数在插入日期时间时没有任何问题。见下文:

INSERT INTO LIBNAME.TestTable (Statuscode, EnteredDate, LastUpdateDate)
Select '2', datetime(), datetime()
From work.PrepTable

我想做以下事情:

INSERT INTO LIBNAME.TestTable (Statuscode, EnteredDate, LastUpdateDate)
VALUES ('2', datetime(), date time()) 

我认为这更有效率,因为我不必查询work.PrepTable。但是datetime()在值语句中不起作用。我尝试了以下变化

INSERT INTO LIBNAME.TestTable (Statuscode, EnteredDate, LastUpdateDate)
VALUES ('2', "&sysdate9:00:00:00"dt,"&sysdate9:00:00:00"dt)

此方法不会输入仅输入日期和输入日期的时间。我在本网站上浏览后尝试了另外一种变化

INSERT INTO LIBNAME.TestTable (Statuscode, EnteredDate, LastUpdateDate)
VALUES ('2', &today_dttm,&today_dttm)

其中& today_dttm来自:

%let today_dttm=%sysfunc(dhms(%sysfunc(today()), 0, 0, 0));

由于我不仅仅是插入日期而不是时间,因此效果不佳。是否有正确的方法可以在不必使用Select语句和datetime()组合的情况下输入调用insert语句的当前日期和时间。

我是sas的新手,任何意见都会非常感激。 感谢

4 个答案:

答案 0 :(得分:2)

这里有一些不同的问题。

首先,&sysdate9.&sysdate.仅为defined at system startup。要获取当前日期,您需要%sysfunc(today(),date9.)%sysfunc(datetime(),datetime17.)。您可以在值语句中使用它。

其次,我不倾向于鼓励在SAS中使用values语句,因为与其他SQL风格相比,它支持的内容非常少。我发现在SAS数据集中使用数据插入数据然后附加该数据集会更好。

data to_insert;
 input statuscode $;
 entereddate=datetime();
 lastupdatedate=datetime();
datalines;
2
;;;;
run;

proc append base=libname.testtable data=to_insert;
run;

第三,您使用日期变量/函数(&sysdate9today())的各种尝试都不包括时间,因为它们是日期变量/函数的日期并且不包含时间。真的是我的第一个建议,就是简单地结合你的两种方法,毕竟。虽然在SAS中可以使用包含小数的日期值转换为以h / m / s完成的日期时间,但它不是"规范"除非您的数据来自其他地方(例如excel)。

答案 1 :(得分:2)

Joe的回答涵盖了它,但这是一个使用SQL的解决方案。

你几乎拥有它。试试这个

%let today_dttm=%sysfunc(datetime());
INSERT INTO LIBNAME.TestTable (Statuscode, EnteredDate, LastUpdateDate)
VALUES ('2', &today_dttm,&today_dttm);

答案 2 :(得分:-1)

您不需要%let部分,只需执行此操作:

INSERT INTO LIBNAME.TestTable (Statuscode, EnteredDate, LastUpdateDate)
VALUES ('2', %sysfunc(datetime()),%sysfunc(datetime()));

答案 3 :(得分:-2)

这些可能有用。它们在WPS中运行,这是一个与SAS兼容的系统:

%let now=datetime();
%let yesterday=intnx('dtDay',datetime(),-1);
%let today=intnx('dtDay',datetime(),0);
%let tomorrow=intnx('dtDay',datetime(),1);

您可以扩展这个想法,然后在PROC SQL中使用它们:

PROC SQL;

SELECT &today as today FORMAT=datetime., &tomorrow as tomorrow FORMAT=datetime.
FROM tablename
;

例如。