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

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

【问题讨论】:

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

标签: sql-server dayofweek monthcalendar


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      相关资源
      最近更新 更多