如何在 SQL Server 中获取上个月的昨天日期?有人可以帮我解决这个问题吗?

Posted

技术标签:

【中文标题】如何在 SQL Server 中获取上个月的昨天日期?有人可以帮我解决这个问题吗?【英文标题】:How to get Satuday's date of previous month in SQL Server? Can someone help me with this query? 【发布时间】:2021-11-14 22:55:24 【问题描述】:

假设现在我们在 9 月,我想要上个月 8 月的最后一个星期六日期的输出,其中 28-08-2021 在 SQL Server 中属于上个月的最后一个星期六

【问题讨论】:

创建 - 静态首选或动态 - 日历表。这是任何方言 SQL 中的基本、常见和频繁的需求。 它应该是动态的...请不要硬编码 【参考方案1】:

..fiddle..

select *, datename(weekday, pmlsat), dateadd(week, 1, pmlsat)
from
(
  select _date, 
    --last saturday of previous month
    dateadd(day, -datepart(weekday, dateadd(day, @@datefirst, eomonth(_date, -1)))%7, eomonth(_date, -1)) as pmlsat
  from
  (
    select top(100) dateadd(month, row_number() over(order by @@spid), '20141215') as _date
    from sys.all_objects
  ) as d
) as p
order by _date;

【讨论】:

【参考方案2】:
DECLARE @date1 DATETIME

SET @date1='2021-8-31'

WHILE Day(@date1) >= 1
  BEGIN
      
      IF (SELECT Datename(weekday, @date1)) = 'Saturday'
        BREAK

      SET @date1=Dateadd(dd, -1, @date1)

      CONTINUE
  END

SELECT Datename(weekday, @date1)                  AS 'Datename',
       (SELECT CONVERT(NVARCHAR(20), @date1, 23)) AS 'DATE' 

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案3】:

首先,让我们谈谈如何获得这个月初。方法有很多种,我觉得DATEFROMPARTS()最直观(见Simplify Date Period Calculations in SQL Server):

DECLARE @FirstOfMonth date = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);

SELECT @FirstOfMonth;

-- result:
-- 2021-09-01

现在,上个月的最后一个星期六必须在本月第一天之前的 1 到 7 天之间。所以我们可以生成一个由 7 个连续数字组成的序列,然后从每月的第一天减去这些天数,如下所示:

DECLARE @FirstOfMonth date = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);

SELECT @FirstOfMonth;

;WITH n(n) AS 
(
  SELECT 1 UNION ALL 
  SELECT n + 1 FROM n WHERE n < 7
)
SELECT d = DATEADD(DAY, -n, @FirstOfMonth) FROM n;

/* result:

2021-08-31
2021-08-30
2021-08-29
2021-08-28
2021-08-27
2021-08-26
2021-08-25 */

要确定星期六是什么,您要么需要依赖DATEPART(WEEKDAY, date) - 这又受SET DATEFIRST 的影响,或者您需要依赖DATENAME(WEEKDAY, date) - 而后者又受SET LANGUAGE 的影响。我会倾向于语言更稳定(英语),所以:

DECLARE @FirstOfMonth date = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);

SELECT @FirstOfMonth;

;WITH n(n) AS 
(
  SELECT 1 UNION ALL 
  SELECT n + 1 FROM n WHERE n < 7
),
d(d) AS 
(
  SELECT DATEADD(DAY, -n, @FirstOfMonth)
  FROM n
)
SELECT LastMonthLastSaturday = d
  FROM d
  WHERE DATENAME(WEEKDAY, d) = 'Saturday';

-- result:
-- 2021-08-28

但这是一个主观的要求 - 如果您不能依赖其中一个,请获取日历表,那么它就是这样的:

SELECT LastMonthLastSaturday = MAX(TheDate) 
  FROM dbo.Calendar 
  WHERE TheDayOfWeekName = 'Saturday' 
  AND TheDate < DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);

【讨论】:

以上是关于如何在 SQL Server 中获取上个月的昨天日期?有人可以帮我解决这个问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中获取一个季度的上个月数据?

如何在 sql server 中获取最近 3 个月的名称

SQL server - 选择日期在上个月的所有项目

如何通过 SQL Server 中的分组列根据日期列的最近 3 个月获取列平均值?

在 SQL Server 2008 中计算到期日期

Sql Server中查询今天昨天本周上周本月上月数据