2014-03-07 61 views
1
CREATE TABLE _Transaction (
transaction_id int, 
date_time datetime default sysdatetime(), 
amount real, 
description varchar(500), 
responsible_party varchar(50), 

CONSTRAINT _transaction_pk PRIMARY KEY(transaction_id), 
CONSTRAINT check_res_prty CHECK(responsible_party IN ('[ATM]','[Teller]','[Bank]','[Standing Order]','[Cheque]','[On-Line]','[Other]')) 
); 

CREATE TABLE _Transaction_account(
account_no int, 
transaction_id int, 
affect_type varchar(50), 

CONSTRAINT _Transaction_account_pk PRIMARY KEY(account_no,transaction_id), 
CONSTRAINT _Transaction_account_fk1 FOREIGN KEY(transaction_id) REFERENCES _transaction(transaction_id), 
CONSTRAINT _Transaction_account_fk2 FOREIGN KEY(account_no) REFERENCES account(account_no), 
CONSTRAINT check_affect_type CHECK(affect_type IN ('[credit]','[debit]')) 
); 

我想寫一個存儲過程以上表這需要賬號和返回本月內該賬戶處理檢查次數。所以我寫了下面的存儲過程如何獲得當月在T-SQL的SQL Server(2008)

CREATE PROCEDURE pro_check_cheques (@accountNo int) 
AS 
BEGIN 
    DECLARE @chques int 
    SELECT @chques=COUNT(t.responsible_party) 
    FROM _Transaction t JOIN _Transaction_account ta ON 
     [email protected] AND ta.transaction_id=t.transaction_id 
    WHERE t.responsible_party = '[Cheque]' AND t.date_time=MONTH(GETDATE()) 
    print @chques; 
END 

但這不行。當我執行sproc時總是得到0計數,但是當我刪除「AND t.date_time = MONTH(GETDATE())」的部分時,它工作正常。 請誰能幫助我? 謝謝

+0

和t.date_time = MONTH(GETDATE()),你比較了一些與此日期時間... –

+0

請注意,標籤獨立。也就是說,你不能合併多個標籤來創建一個概念。標籤'[stored]'和'[procedure]'與單個'[stored-procedure]'標籤不同。請務必閱讀選擇標籤時出現的說明! – Charles

回答

6

MONTH只是返回一年的月份數,所以如果你是比較,所以你最終得到類似WHERE 2014-03-26 = 3,這是錯誤的。你可以用它來獲取當前月份的開始:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101') 

這讓下個月開始:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000201') 

然後,您可以將此到您的查詢,即其中的日期比下月開始大於或等於當前月份的開始,而較少:

SELECT @chques=COUNT(t.responsible_party) 
FROM _Transaction t JOIN _Transaction_account ta ON 
    [email protected] AND ta.transaction_id=t.transaction_id 
WHERE t.responsible_party = '[Cheque]' 
AND t.date_time >= DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101') 
AND t.date_time < DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000201') 

附錄

爲了迴應您的評論,我只向DATEDIFF函數傳遞了3個參數,並且還向DATEADD函數傳遞了3個參數。這從第一次獲得從現在到1900-01-01(目前1370)的月數)。

SELECT DATEDIFF(MONTH, '19000101', GETDATE()) 

由於DATEDIFF只計算邊界數邁過這將返回所有天數的相同數目的月份,無論是第一或最後。 然後它將這個月數加到1900-01-01,這會使你回到本月的第一個月。

DATEADD(MONTH, <datediff calculation>, '19000101') 

其實你可以使用你只要是第一個月的喜歡這方面的任何日期,並使用同一日添加日期和DATEDIFF兩者。

因此,這仍然會回到這個月的開始:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, '20500101', GETDATE()), '20500101') 
+0

這個工作很清楚。感謝您的信息。 請你能解釋DATEIFF()函數的參數是什麼? 我在這裏[]鏈接http://technet.microsoft.com/en-us/library/ms189794(v = sql.105).aspx在這裏發送一些細節,他們傳遞3個參數,但你傳遞4個參數? – Roledenez