2013-02-19 45 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) 
相关问题