2017-10-04 77 views
0

我試圖授予和撤銷從表中選取的用戶標識的服務器角色。如何比較DATE值與GETDATE()的結果

我使用以下查詢從主表向另一個表插入一行到期日,但是該命令沒有將任何行插入到從表中。

Insert into tbl2(userid, role, startdate, expirydate) 
Select userid, role, startdate, expirydate 
from tbl1 
where expirydate = Dateadd(day,0, getdate()) 

如果我使用<=>=上面的查詢工作,但不是有益的,當我們在tbl1有多行。

+0

遠不清楚問題出在哪裏,你可以在問題中添加一些實際的示例數據。 –

+0

插入到EPREM(服務器,INSTANCENAME,DATABASENAME,環境,用戶ID, 訪問,開始日期,expirydate,Grantedby,的TaskID,[狀態],Revokedby) 選擇服務器名,INSTANCENAME,DATABASENAME,環境,用戶ID, 訪問,開始日期,expirydate ,Grantedby,Taskid,[Status],Revokedby from eptrack 其中expirydate = Dateadd(day,0,getdate()) 這是原始查詢,當到期日期是今天時,那麼該行本身應插入從表一旦插入,觸發器就會撤銷訪問。然而該行沒有被插入到從表中(eprem) – aravind

+0

咦?數據。一種可能性是ExpiryDate有時間組件... –

回答

2

這是因爲GETDATE()返回DATETIME值,你很可能相對於一個DATE,讓你有效地比較類似這樣的價值觀:

SELECT GETDATE() AS DateTimeValue, 
     CAST(GETDATE() AS DATE) DateValue; 

輸出:

DateTimeValue   DateValue 
2017-10-04 10:34:35.023 2017-10-04 

默認情況下,如果與DATETIME比較,DATE的時間設置爲午夜,如:2017-10-04 00:00:00.000

這些值都不會與包括時間相等,所以使用CASTCONVERT獲得DATE不受時間:

where expirydate = Dateadd(day,0, CAST(GETDATE() AS DATE)) 

雖然它看起來像你不需要那麼DateaddWHERE子句中,除非這是編輯/示例代碼,否則刪除它。因此,也許它並編輯成這樣:

where expirydate = CAST(GETDATE() AS DATE) 

參考

GETDATE (Transact-SQL)

返回當前數據庫系統時間戳作爲無數據庫時區偏移datetime值。此值是從運行SQL Server實例的計算機的操作系統派生的。

+0

CAST(GETDATE()AS DATE)工作。非常感謝。我的自動授予和撤銷服務器角色的活動已完成:)。 – aravind

+0

@aravind那麼你可以接受這個帖子作爲答案嗎? – SMor