如何在T-SQL sql server中获取当前月份(2008)

时间:2014-03-07 10:46:32

标签: sql sql-server sql-server-2008 stored-procedures

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())”的部分时,它工作正常。 请有人帮帮我吗? 感谢

1 个答案:

答案 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')