【问题标题】:Datepart Week Sql (With 53 weeks for year)Datepart Week Sql(一年有 53 周)
【发布时间】:2023-03-13 06:26:01
【问题描述】:

例如,我正在计算 SQL 中特定日期的星期 '2016-01-20' (yyyy-mm-dd) 但 SQL 返回第 4 周,这是错误的,因为今年第一周从 '2016-01-04' 开始,结果必须是第 3 周。

我认为这个问题已经产生了,因为 2015 年是 53 周的一年,有什么解决办法吗?谢谢你,我很抱歉我的英语不好

【问题讨论】:

  • 为了澄清您的问题,请列出以下内容: 1)您正在使用 datepart 功能的数据库(SQL Server 或 MS Access); 2)您正在编写的具体查询; 3) 您看到的结果或错误; 4) 你期望看到的结果。
  • 如果这是 SQL Server 那么January 1 of any year defines the starting number for the week datepart, for example: DATEPART (wk, 'Jan 1, xxxx') = 1, where xxxx is any year. -msdn
  • 您使用的是什么 RDBMS:SQL Server、MySQL、Oracle ...?答案会有所不同。
  • 假设 SQL Server - 也许您正在寻找 datepart 选项ISO_WEEKHere is some light reading
  • 根据您的问题,周从星期一开始。如果这是您的业务情况,您可能希望创建一个包含此类内容的日历表。我们的数据仓库中有一个,该字段名为 week_beginning。

标签: sql datepart


【解决方案1】:

在 tSQL 中,DATEPART() 返回基于美国和欧洲大部分地区以及英国的正确数据,请参阅 here

你可以使用SET DATEFIRST来调整起始位置。

【讨论】:

  • OP 需要使用ISO_WEEK。 BOL 是完全错误的,ISO 周在欧洲很常见,不仅挪威和瑞典(以及世界其他地区)
【解决方案2】:

第 1 周的 ISO 8601 定义是包含一年中第一个星期四的那一周。我正在使用 Intersystems 缓存,这显然也没有考虑到这一点。所以我用这个来解决这个问题

CASE WHEN 7-datepart(dw,dateadd(dd,1,dateadd(yy,datediff(yy,0,getdate())-1,0))) < 2 
THEN datepart(wk,getdate())-1 ELSE datepart(wk,getdate()) END as WeekNum 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多