SQL Server:为上一个月设置两个变量“月”和“年”,年滚动安全

SQL Server:为上一个月设置两个变量“月”和“年”,年滚动安全,sql,sql-server,Sql,Sql Server,我试图动态地将两个变量(@month和@year)设置为前一个月和前一年的值 因此,在今天的情况下,@month=7和@year=2012 但是我想要一些安全的东西,以备来年使用,所以如果是2013年1月1日,我会得到@month=12和@year=2012 谢谢 这就是我所拥有的 declare @month int declare @year int set @month = month (getDate ())-1 set @year

我试图动态地将两个变量(@month和@year)设置为前一个月和前一年的值

因此,在今天的情况下,
@month=7
@year=2012

但是我想要一些安全的东西,以备来年使用,所以如果是
2013年1月1日
,我会得到
@month=12
@year=2012

谢谢

这就是我所拥有的

declare @month              int
declare @year               int

set @month = month (getDate ())-1
set @year = 2012

按步骤显示。您可以修改分配给
@Now
的值以进行测试

DECLARE @Now DateTime = GETDATE();
DECLARE @Then DateTime = DATEADD(Month, -1, @Now);

DECLARE @Month Int = DATEPART(Month, @Then);
DECLARE @Year Int = DATEPART(Year, @Then);

SELECT @Month, @Year;

按步骤显示。您可以修改分配给
@Now
的值以进行测试

DECLARE @Now DateTime = GETDATE();
DECLARE @Then DateTime = DATEADD(Month, -1, @Now);

DECLARE @Month Int = DATEPART(Month, @Then);
DECLARE @Year Int = DATEPART(Year, @Then);

SELECT @Month, @Year;

作为单个查询,这将给出上个月的第一天:

select DATEADD(month,DATEDIFF(month,'20010101',CURRENT_TIMESTAMP),'20001201')
如果你愿意,你可以把它分成两个独立的变量,但为什么要麻烦呢?(我假设您正在做的其余工作也是使用
datetime
s,而不是
int
s)



选择上面的两个
datetime
字符串是因为它们之间具有所需的关系,即第二个字符串在第一个字符串之前1个月开始。

作为单个查询,这将给出上个月的第一天:

select DATEADD(month,DATEDIFF(month,'20010101',CURRENT_TIMESTAMP),'20001201')
如果你愿意,你可以把它分成两个独立的变量,但为什么要麻烦呢?(我假设您正在做的其余工作也是使用
datetime
s,而不是
int
s)


选择上面的两个
datetime
字符串是因为它们之间具有所需的关系,即第二个字符串比第一个字符串早1个月开始。

您可以使用从当前日期减去一个月,然后抓取
月和
年的部分:

DECLARE @monthAgo dateTime
DECLARE @month int
DECLARE @year int

SET @monthAgo = DATEADD(month, -1, GETDATE())
SET @month = MONTH(@monthAgo)
SET @year = YEAR(@monthAgo)
您可以使用从当前日期减去一个月,然后抓取
月份
年份
部分:

DECLARE @monthAgo dateTime
DECLARE @month int
DECLARE @year int

SET @monthAgo = DATEADD(month, -1, GETDATE())
SET @month = MONTH(@monthAgo)
SET @year = YEAR(@monthAgo)

在你已经拥有的东西之后,你能不能不加上:

if @month = 0
begin
  set @month = 12
  set @year = @year - 1
end

在你已经拥有的东西之后,你能不能不加上:

if @month = 0
begin
  set @month = 12
  set @year = @year - 1
end
试试这个

declare @month int
declare @year int
Declare @dt datetime=getdate()
set @month = DATEPART(mm,DATEADD(mm,-1,@dt))
select @month
set @year = DATEPART(yy,DATEADD(mm,-1,@dt))
select @year
试试这个

declare @month int
declare @year int
Declare @dt datetime=getdate()
set @month = DATEPART(mm,DATEADD(mm,-1,@dt))
select @month
set @year = DATEPART(yy,DATEADD(mm,-1,@dt))
select @year

一月的前一个月是一月吗?上一年总是2011年?1月的前一个月是1月?前一年总是2011年?对
GetDate()
的两个调用将在未来带来一些调试乐趣。我不明白你在这里说什么,请解释。当第一个返回12/31/2041 23:59:59.997,第二个返回01/01/2042 00:00:00.000时,计算将不同步。几乎所有多次需要当前日期/时间的TSQL代码都应该将其捕获到一个变量中,并始终使用该值。一个明显的例外是在捕获操作的开始和结束时间以进行性能分析时。哦,好的。没错。因此我更改了上面的查询,请检查。两次调用
GetDate()
将来会带来一些调试乐趣。我不明白你在这里说什么,请解释。当第一个返回12/31/2041 23:59:59.997,第二个返回01/01/2042 00:00:00.000时,计算将不同步。几乎所有多次需要当前日期/时间的TSQL代码都应该将其捕获到一个变量中,并始终使用该值。一个明显的例外是当捕获一个操作的开始和结束时间进行性能分析时。哦,好的。没错。所以我改变了上面的查询,请检查。