sql 一年的最后一周开始

sql begin end week of year

我无法获取 Sql 服务器中两个日期之间的开始周和结束周?例如:

    begin       end
    2016-04-25  2016-05-01
    2016-05-02  2016-05-08
    2016-05-09  2016-05-15
    2016-05-16  2016-05-22
    2016-05-23  2016-05-29
    2016-05-30  2016-06-05
...

此致!

SQL 具有用于此目的的 DATEDIFF(datepart,startdate,enddate) 函数。

示例:

SELECT DATEDIFF(day,'2014-06-05','2014-08-05') AS DiffDate

结果

61

了解更多关于 DATEFIFF here

在 SQL 服务器中使用 DATEDIFF() 函数

您需要约会 table 才能执行此操作

Declare @start_date datetime = '2016-04-25'
        @end_date datetime = '2016-06-05'

SELECT Min(dt) AS week_start, 
       Max(dt) AS week_end 
FROM   dates_table 
WHERE  date_col > @start_date 
       AND date_col < @end_date 
GROUP  BY Datepart(week, dt), 
          Year(dt) 
ORDER  BY Datepart(week, dt), 
          Year(dt) 

要创建日期 table 并填充日期,这里有几个关于在日期范围内生成日期的问题

  1. How to generate a range of dates in SQL Server

  2. Generate Dates between date ranges

试试这个:

DECLARE @d1 DATE = '2016-04-20' , @d2 DATE = '2016-06-07'
, @mon1 DATE
;WITH 
sunA AS (
  SELECT k=1, dt = @d1, dn = datename(dw,@d1)
  UNION ALL 
  SELECT k=k+1, dt = DATEADD(d,1,dt), dn = datename(dw,DATEADD(d,1,dt))
  FROM sunA 
  WHERE k<7
) 
  SELECT TOP 1 @mon1 = dt 
  FROM sunA
  WHERE dn = 'Monday'
  ORDER BY k

DECLARE @weeks TABLE(d1 DATE, d2 DATE)
WHILE @mon1 >= @d1 AND DATEADD(d, 6, @mon1) <= @d2
BEGIN
  INSERT INTO @weeks SELECT @mon1, DATEADD(d, 6, @mon1)
  SET @mon1 = DATEADD(d, 7, @mon1)
END

SELECT * FROM @weeks

-- OUTPUT
d1          d2
2016-04-25  2016-05-01
2016-05-02  2016-05-08
2016-05-09  2016-05-15
2016-05-16  2016-05-22
2016-05-23  2016-05-29
2016-05-30  2016-06-05