2014-11-05 255 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 
; 

例如。

相關問題