【问题标题】:SQL Server - Get calander month begining and endSQL Server - 获取日历月的开始和结束
【发布时间】:2020-01-29 15:44:02
【问题描述】:

我尝试过搜索,但找不到任何东西。

我正在尝试获取 calander 月的第一个和最后一个日期。

例如,2020 年 1 月的日历月实际上从 2019 年 12 月 30 日开始,到 2020 年 2 月 2 日结束。(第 1 至 5 周)

|---------------------|-------------------|-------------------|
|      Week number    |     From Date     |     To Date       |
|---------------------|-------------------|-------------------|
|       Week 01       | December 30, 2019 | January 5, 2020   |
|---------------------|-------------------|-------------------|
|       Week 05       | January 27, 2020  | February 2, 2020  |
|---------------------|-------------------|-------------------|

Using this website to get week numbers

这可能吗?

非常感谢。

【问题讨论】:

  • 日历 month 的第一个和最后一个日期,按 week 对我来说没有直观意义。您期望样本数据的输出是什么?
  • 我相信 OP 在这里提出了错误的问题。他们希望日历上的日期就像您正在查看墙上或 Outlook 日历中的日历一样。前任。我一月份的日历显示为 2019 年 12 月 29 日和 2 月 1 日。虽然它们不是一月的一部分,但它们只是日历上的“填充物”。
  • 是的,正确。我不想要日期 2020 年 1 月 1 日 - 2020 年 1 月 31 日。相反,我需要日历月份,所以 2019 年 12 月 30 日 - 2020 年 2 月 2 日
  • 作为一个例子,如果我运行:选择 DATEPART(week,'March 23 2020') 即 13。在我在顶部第 13 周添加的链接中是正确的。但我需要那个月的开始,所以在这种情况下,它将是 2020 年 3 月 2 日(第 10 周)作为开始。希望这更有意义?
  • 我可能需要使用类似:SELECT WEEKOFYEAR("2019-12-30") - 这让我回到第 1 周,这将是 2020 年的第 1 周

标签: sql sql-server


【解决方案1】:

如果您使用的是 MSSQL-2012 或更高版本。

DECLARE @DATE DATETIME='29-JAN-2020'

SELECT  DATEADD(DAY, 2 - CASE WHEN DATEPART(WEEKDAY, @DATE-DAY(@DATE)+1)=1 THEN 8 ELSE DATEPART(WEEKDAY, @DATE-DAY(@DATE)+1) END, CAST( @DATE-DAY(@DATE)+1 AS DATE)) [MONTH_START_DATE], 
DATEADD(DAY, 8 - CASE WHEN DATEPART(WEEKDAY, EOMONTH(@DATE))=1 THEN 8 ELSE DATEPART(WEEKDAY, EOMONTH(@DATE)) END , CAST(EOMONTH(@DATE) AS DATE)) [MONTH_END_DATE];

你可以试试下面的链接:-

https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=9747ea25d0d0bc343be8dbcc90803303

【讨论】:

  • 这太完美了!非常感谢
  • 如果我在 2019 年 12 月 1 日做补充,它会带回以下内容 - 月初:2019-12-02(正确)和月底 2020-01-05(不正确)。月底应该是 2019-12-29 - 这是有原因的吗?
  • @Dereck 亲爱的现在检查更新的代码。 1-dec-2019 = 一周的最后一天表示该周的第一天是25-nov-2019,应该是一个月的第一天。 31-dec-2019= 一周的第二天意味着 5-jan-2020 是一周的最后一天,应该是一个月的最后一天。您向您推荐的链接所有周都从星期一开始,到星期日结束。
  • 非常感谢!
【解决方案2】:

你可以使用这个逻辑:

select convert(date, dateadd(day, 1 - day(getdate()), getdate())) as month_first,
       dateadd(day, 1, eomonth(getdate(), -1)) as alternative_month_first,
       eomonth(getdate()) as month_last

当然,您可以使用任何您想要的日期来代替getdate()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多