2017-10-11 106 views
1

我們用下面的SQL片段在where條件的SQL Server存儲過程的:SQL Server查詢的WHERE條件

convert(varchar, CreateDate, 101) <= convert(varchar, GETDATE() - @numberofdays, 101) 
  • CreateDate數據類型爲datetime
  • @numberofdays數據類型是int

你能否確認這種情況是否可以正常工作,在比較日期之前,數據類型是否轉換爲varchar?

+2

你爲什麼在比較它們之前將它們轉換爲字符串?,您可以將它們作爲日期時間進行比較。 –

+0

另外:'GETDATE() - @ NumberOfDays'不是很清楚 - 你肯定**減號運算符會減去天數嗎?這是一個假設....我建議使用'DATEADD(DAYS,-1 * @numberofdays,GETDATE())'清晰明瞭。另外:你應該**總是**爲'varchar'指定一個**顯式長度** - 否則,當一個意外的默認長度啓動時,你可能會遇到一個令人討厭的驚喜..... –

+0

@MarcGuillot表達式GETDATE() - NumberOfDays通過減去天數來返回正確的輸出。你知道使用GETDATE() - NumberOfDays是否會有任何性能影響。如果是的話,我們可以使用dateadd()函數 – bhanu

回答

3
CreateDate <= DATEADD(day,-1*@numberofdays,GETDATE()) 
+0

感謝您回覆Tapakah,但在我的問題上面寫的查詢是錯誤的還是會給出不正確的輸出? – bhanu

+0

Rigth比較datetime類型 –

+1

@bhanu它會給你不正確的輸出,返回12/01/2016大於01/01/2017。如果您確實需要字符串,則應使用格式111,而2016/12/01比2017/01/01小。 –

0

是的,它會工作。

見下面查詢從他們

declare @numberofdays int 
set @numberofdays=3 

declare @CreateDate datetime 
set @CreateDate= '2017-03-20' 

select 
convert(varchar,@CreateDate, 101) as date1, 
convert(varchar,GETDATE()- @numberofdays,101) as date2 

輸出

date1 date2 
03/20/2017 10/08/2017 

這是在相同的格式,並將努力

working demo

+0

它不會引發例外情況,但它會允許2016年日期(例如12/01/2016)被考慮大於2017年的日期(如01/01/2017)。 –

+0

如果他堅持將它們轉換爲字符串,他應該使用格式111(yyyy/mm/dd) –