【问题标题】:in mssql get first, second, third weekdate of current month, what date would it be the next month在 mssql 中获取当前月份的第一、第二、第三周日期,下个月是什么日期
【发布时间】:2020-01-17 09:23:43
【问题描述】:

假设日期是 2019 年 8 月 2 日,也就是本月的第一个星期五。下个月的第一个星期五(9 月 6 日)是什么时候。现在假设我已经 9 月 26 日,这是本月的最后一个星期四。下个月的最后一个星期四是几号。我必须在 MSSQL 中执行此操作。

【问题讨论】:

  • "我必须在 MSSQL 中执行此操作。" 太好了!祝你好运,请在你有答案时分享答案。如果您遇到困难,请编辑此内容以提出问题,并展示您的尝试,并说明您所拥有的内容为何不起作用。谢谢。

标签: sql-server-2016 weekday


【解决方案1】:

对于 9 月 12 日的选项,您会怎么做?听起来你有两个不同的场景。

无论哪种情况,如果您有日期表或日历表,我都会使用它。如果没有,请设置一个。我强烈推荐它。 Ed Pollock 写了一篇关于日期表设置的精彩文章:Designing a Calendar Table。 SQLServer.Info 在这里有一个很好的表示例:Table Example。第二个很好的例子Table Setup

Table Setup。这就是它应该的样子。或者至少是类似的东西。您可以添加更多列进行更多比较。

设置好日历表后,只需将所需日期与表进行比较即可。

这是根据日期表获取下个月第一周的方法

DECLARE @Date DATE = '8/2/2019';

SELECT       [dt].Date
       FROM  [Datetbl] AS [dt]
       WHERE [dt].[Weekday] = DATEPART([weekday], DATEADD(day, -1, @Date)) -- is same day of the week
             AND [dt].Month = DATEPART(month, DATEADD(MONTH, 1, @Date)) -- Grab the month number for "Next Month"
             AND [dt].Year = DATEPART(year, DATEADD(MONTH, 1, @Date)) -- Grab year of next month since that will be different for December
             AND [dt].[WeekOfMonth] IN
     (SELECT       MIN([WeekOfMonth])
             FROM  [Datetbl] AS [dt1]
             WHERE [dt1].[Weekday] = DATEPART([weekday], DATEADD(day, -1, @Date))
                   AND [dt1].Month = DATEPART(month, DATEADD(MONTH, 1, @Date))
                   AND [dt1].Year = DATEPART(year, DATEADD(MONTH, 1, @Date))
     ); -- returns Sept 6

这是根据日期表获取该月最后一个工作日的方法

DECLARE @Date DATE = '9/26/2019';

SELECT       [dt].Date
       FROM  [Datetbl] AS [dt]
       WHERE [dt].[Weekday] = DATEPART([weekday], DATEADD(day, -1, @Date)) -- is same day of the week
             AND [dt].Month = DATEPART(month, DATEADD(MONTH, 1, @Date)) -- Grab the month number for "Next Month"
             AND [dt].Year = DATEPART(year, DATEADD(MONTH, 1, @Date)) -- Grab year of next month since that will be different for December
             AND [dt].[WeekOfMonth] IN
     (SELECT       MAX([WeekOfMonth])
             FROM  [Datetbl] AS [dt1]
             WHERE [dt1].[Weekday] = DATEPART([weekday], DATEADD(day, -1, @Date))
                   AND [dt1].Month = DATEPART(month, DATEADD(MONTH, 1, @Date))
                   AND [dt1].Year = DATEPART(year, DATEADD(MONTH, 1, @Date))
     ); -- returns Oct 31st

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多