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]'))
);
我想在上面的表中写一个存储过程,它接受帐号并返回当前月份为该帐号处理的支票数。所以我写了下面的存储过程
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
ta.account_no=@accountNo 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 :(得分: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
ta.account_no=@accountNo 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')
您可以实际使用您喜欢的任何日期,只要它是一个月的第一天,并且您在日期添加和日期中使用相同的日期。
所以这仍将是本月的开始:
SELECT DATEADD(MONTH, DATEDIFF(MONTH, '20500101', GETDATE()), '20500101')