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

Rol*_*nez 1 sql sql-server stored-procedures sql-server-2008

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]'))
);
Run Code Online (Sandbox Code Playgroud)

我想在上面的表中写一个存储过程,它接受帐号并返回当前月份为该帐户处理的支票数.所以我写了下面的存储过程

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
Run Code Online (Sandbox Code Playgroud)

但这不起作用.当我执行sproc时总是得到0计数,但当我删除"AND t.date_time = MONTH(GETDATE())"的部分时,它工作正常.请有人帮帮我吗?谢谢

Gar*_*thD 6

MONTH只返回一年中的月份数,所以如果你要进行比较,那么你最终会得到类似的东西WHERE 2014-03-26 = 3,这是错误的.您可以使用它来获取当月的开头:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101')
Run Code Online (Sandbox Code Playgroud)

这将是下个月的开始:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000201')
Run Code Online (Sandbox Code Playgroud)

然后,您可以将此应用于您的查询,即日期大于或等于当前月份的开头,并且小于下个月的开始:

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')
Run Code Online (Sandbox Code Playgroud)

附录

在回复你的评论时,我只向DATEDIFF函数传递了3个参数,并且还向DATEADD函数传递了3个参数.这是通过首先获得从现在到1900-01-01(现在是1370)之间的月数来实现的.

SELECT DATEDIFF(MONTH, '19000101', GETDATE())
Run Code Online (Sandbox Code Playgroud)

由于DATEDIFF仅计算越过边界的数量,因此将返回该月中所有日期的相同数字,无论是第一个还是最后一个.然后它会增加这个月数1900-01-01,这将使您回到本月的第一个月.

DATEADD(MONTH, <datediff calculation>, '19000101')
Run Code Online (Sandbox Code Playgroud)

你可以实际使用你喜欢的任何日期,只要它是一个月的第一天,并且你在date add和datediff中使用相同的日期.

所以这仍然会回到本月的开始:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, '20500101', GETDATE()), '20500101')
Run Code Online (Sandbox Code Playgroud)