2014-03-07 35 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