Sql server 如何在SQL Server中获取前12个月的数据并避免当前月份

Sql server 如何在SQL Server中获取前12个月的数据并避免当前月份,sql-server,Sql Server,在我的表中有一个名为Sale Date的列,我希望获得不包含当前月份的12个月数据。也就是说,由于我们是在2021年4月,查询需要显示从2020年4月到2021年3月的数据。where子句中的条件应该是什么。以下条件应该有效,计算结果为='2020-04-01 00:00:00.000'和=DateAdd(月,日期差(月,0,日期添加(月,-12,GetDate()),0) 和dateColumn=DATEADD(year,-1,DATEFROMPARTS(year(GETDATE()),MON

在我的表中有一个名为
Sale Date
的列,我希望获得不包含当前月份的12个月数据。也就是说,由于我们是在2021年4月,查询需要显示从2020年4月到2021年3月的数据。where子句中的条件应该是什么。

以下条件应该有效,计算结果为
='2020-04-01 00:00:00.000'
=DateAdd(月,日期差(月,0,日期添加(月,-12,GetDate()),0)
和dateColumn
试试这个

where DATEDIFF(MM,SaleDate,GETDATE())<=12
and SaleDate < DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
where-DATEDIFF(MM,SaleDate,GETDATE())
where-SaleDate>=DATEADD(year,-1,DATEFROMPARTS(year(GETDATE()),MONTH(GETDATE()),1))
和SaleDate
假设我们在2021年4月15日

在这种情况下,
DATEFROMPARTS(YEAR(GETDATE()),MONTH(GETDATE()),1)
返回
2021年4月1日
DATEADD(YEAR,-1,…
返回
2020年4月1日

因为我们有一个半开放的时间间隔
=和这是你想要的吗?(2020年4月1日和2021年3月31日)

从TBL1中选择*
其中SalesDate>DATEADD(年份,-1,转换日期,DATEADD(MM,DATEDIFF(MM,0,
GETDATE(),0)))
和SalesDate
今天的日期=getdate()。 本月第一天的日期(4月1日)=转换(datetime,concat(年(getdate()),'-',月(getdate()),'-01'),120)。这是您的结束日期。开始日期是结束日期之前12个月=dateadd(月,-12,…)。 这是你的where子句

where [sale date] >= dateadd(month, -13, convert(datetime, concat(year(getdate()), '-', month(getdate()), '-01'), 120))
and [sale date] < convert(datetime, concat(year(getdate()), '-', month(getdate()), '-01'), 120)
where[sale date]>=dateadd(月-13,转换为日期时间,concat(年(getdate()),'-',月(getdate()),'-01'),120))
和[销售日期]<转换(datetime,concat(年(getdate()),'-',月(getdate()),'-01'),120)

比所有发布的答案更简单的方法:

WHERE
  saledate >= dateadd(d,1,eomonth(getutcdate(),-13)) AND
  saledate < dateadd(d,1,eomonth(getutcdate(),-1))
在哪里
saledate>=dateadd(d,1,eomonth(getutcdate(),-13))和
saledate
如果saledate只是日期,而不是时间,则会变得更简单:

WHERE
  saledate > eomonth(getutcdate(),-13) AND
  saledate <= eomonth(getutcdate(),-1)
在哪里
saledate>eomonth(getutcdate(),-13)和

即使我是在四月中旬,如果我是在4月15日,但是我仍然需要从去年4月1日2020到3月31日2021看到更多的编辑非常感谢你,我得到它,我是新的StAccess,我怎么能接受两个答案是正确的,上面的解决方案由Stu也纠正你不能,但你可以赞成两个,你CAN也改变你想要接受哪一个,即使我在四月中旬,说我在4月15日,但是我仍然需要从去年4月1日2020直到3月31日2021-你试过了吗?我会增加几天来获得日期和检查和回来,所以你在这里做的是选择日期从前12个月的第一部分。当前月份的where子句和第二子句获取第一天并将记录限制在该天之前。因此,它会过滤掉当前月份。感谢您的帮助。这很酷。很高兴它帮助了您。这有什么作用DATEADD(month,DATEDIFF(month,0,GETDATE()),0)。我知道datediff将返回4个月,但是在
datediff(month,0,GETDATE())
之后发生的事情将给出从
1900-01-01
到现在的月数。因此,在
DATEADD(month,datediff(month,0,GETDATE()),0)
将相同的月数添加回
1900-01-01
,以获得当前月的开始日期。
WHERE
  saledate >= dateadd(d,1,eomonth(getutcdate(),-13)) AND
  saledate < dateadd(d,1,eomonth(getutcdate(),-1))
WHERE
  saledate > eomonth(getutcdate(),-13) AND
  saledate <= eomonth(getutcdate(),-1)