【问题标题】:How to get "Week of 2nd" based on date field in SQL Server 2012如何根据 SQL Server 2012 中的日期字段获取“第 2 周”
【发布时间】:2018-03-24 19:07:36
【问题描述】:

我的表中有一个DueDate 列,基于该日期,我想显示基于星期一日期的“...的周”值。

所以我想要这样的东西:

【问题讨论】:

  • 您不想显示完整日期吗?当一周的开始是不同的月份时,您希望发生什么?例如 11 月 1 日?
  • 使用适当的软件(MySQL、Oracle、DB2...)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案,例如DateFromParts()。请注意,tsql 缩小了选择范围,但没有指定数据库。

标签: sql-server tsql date sql-server-2012


【解决方案1】:

您可以将找到的答案here 与“DatePart”函数结合起来,如下所示:

SELECT  
        'Week Of ' + CONVERT(VARCHAR(2), DATEPART(DAY,DATEADD(DAY, (2-DATEPART(WEEKDAY, GETDATE())), GETDATE()) )) + CASE
                                                                      WHEN DATEPART(DAY, GETDATE()) % 100 IN (11,12,13) THEN 'th' --first checks for exception
                                                                      WHEN DATEPART(DAY, GETDATE()) % 10 = 1 THEN 'st'
                                                                      WHEN DATEPART(DAY, GETDATE()) % 10 = 2 THEN 'nd'                                                                                                              
                                                                      WHEN DATEPART(DAY, GETDATE()) % 10 = 3 THEN 'rd'                                                                                                              
                                                                      ELSE 'th' --works for num % 10 IN (4,5,6,7,8,9,0)                                                                                                         
                                                                    END

【讨论】:

  • 谢谢,但...的`周需要以星期一为基础。就像在一个例子中
  • @Oleg 我已经编辑了我的答案以更好地匹配您的问题
  • 太棒了!非常感谢!
  • 旁白:更偏执的解决方案会考虑@@DateFirst,因为它会影响从DatePart() 返回的WeekDay
【解决方案2】:

试试这个:

select date,
('week of ' + 
 convert(varchar(2), datepart(day, DATEADD(day, -(case when datepart(weekday, date)=1 then 8 else datepart(weekday, date) end)+2, date))))
as monday
from table1;

Fiddle

如果星期天不是上一个星期一而是下一个星期一,这可能会更简单

【讨论】:

    【解决方案3】:

    我认为您可以使用 DATEPART 函数来获取一周中的数字日期,然后构建一个案例语句来说明星期一开始...就像这样(您可以在我有的地方替换您的日期“2017 年 10 月 1 日”):

    select 'Week of ' + CONVERT(VARCHAR(10),DATEADD(dd, -DATEPART(dw,'10/1/2017')
       + CASE WHEN DATEPART(dw,'10/1/2017') = 1 THEN -5 ELSE 2 END, '10/1/2017'),101)
    

    编辑:刚刚意识到我的答案实际上与 Psidom 的相同;耶慢打字。

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多