2014-04-03 138 views
0

我有一個存儲過程,使用像以下選擇,到目前爲止工作正常。 例如,在這種情況下,它選擇具有來自上個月(即2014年3月)的日期的所有記錄(列:dateEsc,格式爲nvarchar(20),示例日期:2014-03-25)。SQL Server:使用參數,而不是GETDATE()

我的選擇(例如):

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()計算上個月與當前月份相比,我想從變量date輸入計算相同的月份。非常感謝任何幫助,Tim。

+0

什麼用'可以轉換成(VARCHAR(6)'這部分?還有爲什麼你的日期esc列存儲爲'VARCHAR(20)'? – Zane

+0

@贊 - 這是它如何從日期時間記錄中刪除非年/月數據 - 它是不是最好的辦法,看我的回答。 – Hogan

+0

@Hogan,但然後將該日期轉換回日期將其返回到YYYY-MM-DD – Zane

回答

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) 

如果在日期字段上的索引這可以做一個尋求。

如果定義爲日期或日期時間參數@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

+0

非常感謝。我會檢查這一點。 – user2571510

+0

這工作完美 - 我的錯誤是,我沒有參數設置爲日期時間。再次感謝 ! – user2571510

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 

也許這會給你你會如何實現的參數來實現自己的組數的一些創意。所有的

+0

謝謝。是的,我在這裏尋找一個參數,但我不知道如何在select中引用這個參數而不是GETDATE()。 – user2571510

相關問題