sql查找今天日期之后的所有星期一

时间:2012-03-08 10:34:32

标签: sql sql-server

我有以下sql语句来查找一年中的所有星期一日期。

    SELECT DateAdd(week, 
                   o1.v + o0.v, 
                   DateAdd(day, 
                           2 - DatePart(dw, Convert(VARCHAR(4), 2012) + '-01-01'), 
                           Convert(VARCHAR(4), 2012) + '-01-01'
                          )
                  )
      FROM (SELECT  0 AS v UNION 
            SELECT  8 UNION 
            SELECT 16 UNION 
            SELECT 24 UNION 
            SELECT 32 UNION 
            SELECT 40 UNION 
            SELECT 48) AS o1
CROSS JOIN (SELECT 0 AS v UNION 
            SELECT 1 UNION 
            SELECT 2 UNION 
            SELECT 3 UNION 
            SELECT 4 UNION 
            SELECT 5 UNION 
            SELECT 6 UNION 
            SELECT 7) AS o0
     WHERE 2012 = DatePart(year, 
                           DateAdd(week, 
                                   o1.v + o0.v, 
                                   DateAdd(day, 
                                           2 - DatePart(dw, Convert(VARCHAR(4), 2012) + '-01-01'), 
                                           Convert(VARCHAR(4), 2012) + '-01-01')
                                  )
                          )

我如何修改它以查找今天日期之后的所有星期一日期?

4 个答案:

答案 0 :(得分:3)

我会创建一个calendar table而不是编写一个复杂的查询。然后你可以写一个清晰,简单的查询:

select 
    c.BaseDate
from 
    dbo.Calendar c
where 
    c.DayOfWeek = 'Monday' and
    c.YearNumber = year(getdate()) and
    c.BaseDate > getdate()

作为一般规则,日历表是使用日期的最简单的解决方案,因为查询和维护比函数简单得多,并且您可以在需要支持新的日期属性时添加列。

答案 1 :(得分:1)

有很多功能可以帮助很长时间用CTE,它会很简单,下面有些建议,希望对它有所帮助。

declare @DateFrom Date 
declare @DateTo Date

set @DateFrom ='2016-01-01'
set @DateTo = '2016-12-31'

SELECT AllDates as MonDates from 
(Select DATEADD(d, number, @dateFrom) as AllDates from master..spt_values 
   where type = 'p' and number between 0 and datediff(dd, @dateFrom,   @dateTo)) AS D1    
WHERE DATENAME(dw, D1.AllDates)In('Monday')

答案 2 :(得分:0)

你可以在哪里做,但我觉得它很复杂。 CTE是一个很好的解决方法:

with DAYS as (
  SELECT DateAdd(week, o1.v + o0.v, DateAdd(day, 2 - DatePart(dw
,  Convert(VARCHAR(4), 2012) + '-01-01'), Convert(VARCHAR(4)
,  2012) + '-01-01')) as MY_DAY
   FROM (SELECT 0 AS v UNION SELECT 8 UNION SELECT 16 UNION SELECT 24
      UNION SELECT 32 UNION SELECT 40 UNION SELECT 48) AS o1
   CROSS JOIN (SELECT 0 AS v UNION SELECT 1 UNION SELECT 2 UNION SELECT 3
      UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7) AS o0
   WHERE 2012 = DatePart(year, DateAdd(week, o1.v + o0.v, DateAdd(day
,     2 - DatePart(dw, Convert(VARCHAR(4), 2012) + '-01-01')
,     Convert(VARCHAR(4), 2012) + '-01-01')))
)
select MY_DAY from DAYS
where MY_DAY >getdate()

答案 3 :(得分:0)

我成功地使用了这个查询(我调整了其中一个答案here

SELECT MondaysThisMonth = cast (DATEADD(DAY,n,MondayBeforeFOM) as date)
FROM (
   SELECT FirstOfMonth, MondayBeforeFOM = DATEADD(DAY,DATEDIFF(DAY,0,FirstOfMonth)/7*7,0)
   FROM (SELECT FirstOfMonth = DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0)) d
) e
CROSS JOIN (SELECT 7 UNION ALL SELECT 14 UNION ALL SELECT 21 UNION ALL SELECT 28 UNION ALL SELECT 35) f (n)
WHERE DATEADD(DAY,n,MondayBeforeFOM) < DATEADD(MONTH,1,FirstOfMonth)
相关问题