sql-server-2008 - 当我知道 ISO 8601 中的周数时如何获得一周的第一天

标签 sql-server-2008 datetime iso8601

例如我知道年份和星期数

year = 2016
week = 1

如何根据 ISO 8601 从中获取一周的第一天

我在表 datetime2[0] 中生成默认值 2015-12-28 的日期类型,但一周的第一天应该是 2016-01- 04

有什么想法吗?

最佳答案

给定任何日期,此 SQL 将返回 ISO 周:SELECT DATEPART(ISO_WEEK, @date)。下面是一个丑陋(但非常有效)的单行代码,用于计算该 ISO 周的第一个日期:

DECLARE @date DATETIME = '2012-09-16'
SELECT (
    CASE DATEPART(ISO_WEEK, @date) 
        WHEN DATEPART(ISO_WEEK, DATEADD(DAY,-6,@date)) THEN DATEADD(DAY,-6,@date)
        WHEN DATEPART(ISO_WEEK, DATEADD(DAY,-5,@date)) THEN DATEADD(DAY,-5,@date)
        WHEN DATEPART(ISO_WEEK, DATEADD(DAY,-4,@date)) THEN DATEADD(DAY,-4,@date)
        WHEN DATEPART(ISO_WEEK, DATEADD(DAY,-3,@date)) THEN DATEADD(DAY,-3,@date)
        WHEN DATEPART(ISO_WEEK, DATEADD(DAY,-2,@date)) THEN DATEADD(DAY,-2,@date)
        WHEN DATEPART(ISO_WEEK, DATEADD(DAY,-1,@date)) THEN DATEADD(DAY,-1,@date)
        ELSE DATEADD(DAY,0,@date)
    END
) FirstDayOfISOWeek

现在,这不是我最漂亮的作品,但它通过反复试验工作 - 测试多少天前的 ISO 周仍然相同,然后返回那一天。

关于sql-server-2008 - 当我知道 ISO 8601 中的周数时如何获得一周的第一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34267447/

相关文章:

java - 同时过滤和映射一个java流

c# - 系统.日期时间.ParseExact : unrecognized format string

datetime - 时间和日期解析的测试数据(多种格式)

java - 使用 ISO8601 格式的 SQLite 中的日期比较

mysql - 如何使用 MySQL 查询 JSON 对象内未修改的时间戳?

sql-server - 使 SQL Server 存储过程免受 SQL 注入(inject)的影响

sql-server-2008 - Business Intelligence Development Studio 2008 安装

sql-server - 使用查询或存储过程延迟 SQL Server 2000 查询直到处理器利用率低于 50%?

SQL - 从上面的行返回值

mysql - 按日期显示周