我在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的新手,任何意见都会非常感激。 感谢
答案 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;
第三,您使用日期变量/函数(&sysdate9
,today()
)的各种尝试都不包括时间,因为它们是日期变量/函数的日期并且不包含时间。真的是我的第一个建议,就是简单地结合你的两种方法,毕竟。虽然在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
;
例如。