2014-11-05 254 views
2

我在SAS EG中将日期时间插入到数据库表名(TestTable)中有一个小问题。在TestTable的日期字段定义为在SAS中的SQL表中插入日期/时间

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语句插入,而不是一个值的语句。这里是调用我根本不使用的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语句。

我是一个新手萨斯和任何输入将不胜感激。 谢谢

回答

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转换为datetime,但它不是“规范”,除非您的数据来自其他地方(如excel)。

+0

谢谢乔,这是非常有帮助的。我从来没有想过使用数据步骤来插入。我会给这个镜头。在这里大声想一想,如果我不得不插入来自可能具有这50列的多行的预备表的50列数据,这个插入数据步骤会变得具有挑战性吗?在这种情况下,我将不得不使用interator,然后在迭代器中有数据步骤来插入每一行。如果我的思路不正确,请纠正我。给你一个绿色检查和对你的答案有帮助的+1 – vbala2014 2014-11-05 21:05:39

+0

你可以简单地插入整个数据集,使用'PROC APPEND'(或其他方法,但通常是最快和最简单的方法)。您甚至不必指定列(只要它们的名称匹配 - 不必是相同的顺序,只是相同的实际名称)。 – Joe 2014-11-05 21:06:43

+0

好的再次感谢,我会给这个去使用更大的数据集,看看我是否可以使用迭代器与proc追加时间的性能。非常感谢您的帮助 – vbala2014 2014-11-05 21:08:56

2

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

你几乎拥有它。试试这个

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

非常感谢DomPazz,非常感谢您的回复。我给你+1和一个绿色的复选标记为你的答案。 – vbala2014 2014-11-05 21:06:48

-1

你不需要%let部分,只是这样做:

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

欢迎来到Stack Overflow!尽管这段代码可以解决这个问题,但[包括一个解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高您的帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – kayess 2017-01-13 13:07:25

-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 
; 

例如。

相关问题