sql - 给定周数,在 T-SQL 中返回一周的第一天

标签 sql sql-server tsql date

这将给我一个基于日期的周数:

SELECT DATEPART(wk, '7/27/2016') AS [Week]

例如,返回 31。

现在,我需要做的是找到那个星期的第一天,并以短日期格式返回它。例如:

Given Week: 31
Return First Day of Week: July 24

或者

Given Week: 52
Return First Day of Week: Dec 25

我相信一周的默认第一天是星期日,这就是我需要的日期。

我在这里看到了几篇接近的帖子,但没有一篇让我一路走下去。

谢谢!

最佳答案

我帮助从内到外阅读这篇文章。我添加了带编号的评论以提供帮助。

declare @weekNum int;set @weeknum = 52;
select 
-- 3.  Add number of weeks
dateadd(wk, @weekNum, 
    --2.  first day of week 0 for that year (may belong to previous year)
    dateadd(ww, datediff(wk, 0, 
        --1.  First date of the year (week 0)
        dateadd(YEAR, datediff(year,0, getDate()),0)
     ),-1) -- -1 here because 1900-01-01 (date 0) was a Monday, and adding weeks to a Monday results in a Monday.
)

我们可以结合第二步和第三步,因为它们都会增加周数:

declare @weekNum int;set @weeknum = 52;
select 
    --2.  first day of week 0 for that year (may belong to previous year) + number of weeks
    dateadd(ww, @weekNum + datediff(wk, 0, 
        --1.  First date of the year (week 0)
        dateadd(YEAR, datediff(year,0, getDate()),0)
     ),-1) -- -1 here because 1900-01-01 (day 0) was a Monday. Adding weeks to a Monday results in a Monday

另外,我认为你的第 31 周的例子比现在晚了一周。您可以像这样查看当年的完整集合:

with weeks as 
(
    select top 52 row_number() over (order by  object_id) as wk  from sys.objects
)
select wk,
    --2.  first day of week 0 for that year (may belong to previous year) + number of weeks
    dateadd(ww, wk + datediff(wk, 0, 
        --1.  First date of the year (week 0)
        dateadd(YEAR, datediff(year,0, getDate()),0)
     ),-1) -- -1 here because 1900-01-01 (day 0) was a Monday. Adding weeks to a Monday results in a Monday
from weeks

关于sql - 给定周数,在 T-SQL 中返回一周的第一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38615906/

相关文章:

sql - Oracle:类似于 sysdate 但只返回时间和日期

python - Python/psycopg2 中的优雅主键错误处理

c# - 显示 GridView 中的行数

sql聚合选择结果

带时区的 SQL Server DateTime

sql-server - SQL Server 脚本语法错误和 "must declare the scalar value"

sql - 从匿名 block 中的变量创建带密码的用户

SQL 表作为矩阵 (T-SQL)

sql - 将比较运算符作为参数传递并直接在 SQL 存储过程中使用

SQL Server 查询排名 (RowNumber) 和分组