SQL Server:使用参数而不是GETDATE()

时间:2014-04-03 16:53:32

标签: sql sql-server date select date-arithmetic

我有一个存储过程使用如下所示的选项,到目前为止工作正常。 在这种情况下,例如,它选择具有上个月日期的所有记录,即2014年3月(列:dateEsc,格式为nvarchar(20),示例日期:2014-03-25)。

我的选择(示例):

SELECT COUNT(*) AS groupCount
FROM Log_Esc
WHERE 
    CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), DATEADD(month, -1, GETDATE()), 112) + '01', 112)

如果不是当前日期(GETDATE()),我如何更改此项?我想使用变量日期输入作为参考。 此输入可以是任何日期,格式为nvarchar(20),例如:2014-04-03。

因此,我不想从GETDATE()计算上个月和当前月份,而是想从变量日期输入计算相同的月份。

非常感谢你提供任何帮助,蒂姆。

2 个答案:

答案 0 :(得分:1)

首先,我认为这个查询比你的查询更好:

SELECT COUNT(*) AS groupCount
FROM Log_Esc
WHERE DATE >= dateadd(month,datediff(month,0,dateadd(month,GETDATE(),-1)),0)
 AND  DATE <  dateadd(month,datediff(month,0,GETDATE()),0)

如果DATE字段中有索引,则可以进行搜索。

如果您将参数@indate定义为日期或日期时间,那么这将起作用

SELECT COUNT(*) AS groupCount
FROM Log_Esc
WHERE DATE >= dateadd(month,datediff(month,0,dateadd(month,@indate,-1)),0)
 AND  DATE <  dateadd(month,datediff(month,0,@indate),0)

请参阅此问题,了解有关将日期汇总到一个月的更多信息:Floor a date in SQL server

答案 1 :(得分:0)

所以你想要的是一个参数:

Specifying Parameters in a Stored Procedure

参数允许您传递用户输入以修改输出。

一个例子

CREATE PROCEDURE dbo.Param1
@param int 
AS
BEGIN

select 7 *@param as Value
END

EXEC dbo.Param1 5 -- 7 *5
EXEC dbo.Param1 -10  -- 7 * -10

或许这会为您提供一些有关如何实施参数以完成小组计数的创意。