2013-02-19 82 views
2

我想在SQL Server 2008中的兩個日期之間計數狀態爲0的記錄 有我的過程,但它不正確trows錯誤。存儲過程計數兩個日期之間的記錄

消息156,級別15,狀態1,過程sp_SerchPickupHispanicBetweenDates,第6行
'之間' 的關鍵字附近的語法不正確。

程序看起來像

CREATE procedure sp_SerchPickupHispanicBetweenDates 
@date1 date, 
@date2 date 
as 
select COUNT (Pickuphispanic) from pickup 
where Pickuphispanic = 1 and pickupdate like between @date1+ '%' and @date1 +'%' 

試圖在互聯網搜索解決方案,但沒有成功。 任何想法如何使它正確? 我也有選擇statment這完美的作品

select COUNT (Pickuphispanic) from pickup 
where Pickuphispanic = 1 and pickup.pickupdate between '2006-07-01' and '2010-12-31' 
+1

旁註:你應該**不* *爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也不好](http://sqlserverpedia.com/blog/sql-server-bloggers/stored-procedure-performance-using-%E2%80%9Csp_%E2%80%9D-prefix- %E2%80%93-神話或-事實/)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! – 2013-02-19 09:17:16

回答

3

@date1@date2參數的數據類型DATE的,因此你不能追加%這些值(%可以用於基於字符串的數據類型當使用LIKE運營商;還有:您不能LIKE應用於使用DATE值的搜索)。

用這個代替:

CREATE procedure procSerchPickupHispanicBetweenDates 
    @date1 date, 
    @date2 date 
AS 
    SELECT COUNT (Pickuphispanic) 
    FROM dbo.pickup 
    WHERE Pickuphispanic = 1 
    AND pickupdate BETWEEN @date1 AND @date2 

要調用這個,用這個語法:

EXEC procSerchPickupHispanicBetweenDates '2006-07-01', '2010-12-31' 

(無括號,沒有括號 - 只需指定兩個日期),或:

EXEC procSerchPickupHispanicBetweenDates @date1 = '2006-07-01', @date2 = '2010-12-31' 
+0

當我打電話funktion {procSerchPickupHispanicBetweenDates('2006-07-01','2010-12-31')}它拋出錯誤消息102,級別15,狀態1,行1 '2006-07-01' 。 – Andrey 2013-02-19 09:24:31

+0

你是**確定**你是在SQL Server ** 2008 ** ??聽起來你可能會連接到一個不支持'DATE'的舊引擎。 「SELECT @@ Version」給你什麼結果? – 2013-02-19 09:33:33

+0

是的,它是SQL Server 2008 Express – Andrey 2013-02-19 09:34:39

2

如果您嘗試在2個日期之間進行搜索,則存儲過程必須如下所示:

pickupdate between @date1 and @date2 

你不必使用LIKE FUNCTION

+0

它仍然拋出錯誤 – Andrey 2013-02-19 09:21:00

+0

什麼是錯誤? – Gericke 2013-02-19 09:24:58

+0

如果你想要計數(Pickuphispanic)= 1那麼在你的存儲過程中你必須使用有計數(Pickuphispanic)= 1來代替哪裏條款。 – Gericke 2013-02-19 09:27:29

1

喜歡不能嵌套上之間功能。

試試這個:

CREATE procedure sp_SerchPickupHispanicBetweenDates 
@date1 date, 
@date2 date 
as 
select COUNT (Pickuphispanic) from pickup 
where Pickuphispanic = 1 and CONVERT(VARCHAR(25), pickupdate , 126) like @date1 + '%' and @date1 + '%' 

問候

+0

工作,爲什麼需要這個CONVERT(VARCHAR(25),pickup日期,126)? – Andrey 2013-02-19 09:25:47

1

修改查詢是這樣的:

SELECT COUNT (Pickuphispanic_ID) from pickup 
where Pickuphispanic = 1 and pickupdate between @date1 AND @date2 

SELECT COUNT (Pickuphispanic_ID) from pickup 
where Pickuphispanic = 1 and pickupdate> @date1 AND pickupdate<@date2 
+0

它的工作,但如何調用過程?如果使用procSerchPickupHispanicBetweenDates('2006-07-01','2010-12-31'),則會給出錯誤消息102,級別15,狀態1,行1 「2006」附近的語法錯誤。 – Andrey 2013-02-19 09:28:16

+0

你必須執行它: EXEC procSerchPickupHispanicBetweenDates('2006-07-01','2010-12-31') – Gericke 2013-02-19 09:31:07

+0

它不會像日期一樣的錯誤 – Andrey 2013-02-19 09:32:42

0

就像不能嵌套在功能之間。

,如果你想使用像那麼就應該是這樣的

CREATE procedure sp_SerchPickupHispanicBetweenDates 
@date1 date, 
@date2 date 
as 
select COUNT (Pickuphispanic) from pickup 
where Pickuphispanic = 1 and (CONVERT(VARCHAR, pickupdate ,106) like CONVERT(VARCHAR,@date1,106) + '%' or CONVERT(VARCHAR, pickupdate ,106) like CONVERT(VARCHAR,@date2,106) + '%') 

,你想,然後之間使用它應該是這樣的

CREATE procedure procSerchPickupHispanicBetweenDates 
    @date1 date, 
    @date2 date 
AS 
    SELECT COUNT (Pickuphispanic) 
    FROM dbo.pickup 
    WHERE Pickuphispanic = 1 
    AND Convert(date,pickupdate) BETWEEN Convert(date,@date1) AND Convert(date,@date2) 
相關問題