计算每月第一天的星期日数

时间:2014-05-06 19:28:26

标签: sql sql-server

有人可以编写SQL查询:

  1. 打印1900年1月1日至2000年12月31日的所有星期日,即每月的第1天。
  2. 计算从1900年1月1日到2000年12月31日的第1个月的星期日的数量。

2 个答案:

答案 0 :(得分:0)

生日快乐,我很无聊,这看起来很有趣,而且对其他人来说也很有用。这不会帮助您理解让别人为您编写查询的任何内容,但这会为您提供您正在寻找的结果。

Declare @Date Table (N TinyInt Not Null)
Insert  @Date Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)

Declare @Results Table (Date Date Not Null Primary Key Clustered)

Insert  @Results
Select  X.Date
From
(
    Select      Distinct Cast(DateAdd(Day, -(A.N + (10 * B.N) + (100 * C.N) + (1000 * D.N) + (5000 * E.N)), GetDate()) As Date) Date
    From        @Date   A
    Cross Join  @Date   B
    Cross Join  @Date   C
    Cross Join  @Date   D
    Cross Join  @Date   E
) X
Where X.Date Between '1900-01-01' And '2000-12-31'
And DatePart(WeekDay, X.Date) = 1
And DatePart(Day, X.Date) = 1

Select Date From @Results
Select Count(1) From @Results

答案 1 :(得分:0)

解决方案相当容易。知道1900年1月1日是星期一,我们可以从1月7日开始,这是该范围内的第一个星期日。然后我们生成所有后续星期日,通过递归cte迭代地(或递归地)添加7直到我们到2000年12月31日。然后我们过滤数据,使得我们仅采用月中的日期为1的那些日期。

默认情况下,SQL Server的递归深度限制为100。所以我们需要提高它。 101年不到5300个星期天。让我们设置一个5300的递归深度。

with sundays ( sundaydate ) as
(
  select cast('1900-01-07' as date) as sundaydate
  union all
  select dateadd(day, 7, sundaydate) as sundaydate
  from sundays
  where sundaydate <= cast('2000-12-31' as date) 
)
select *
from sundays
where datepart(day, sundaydate) = 1
option (maxrecursion 5300);

这是SQL小提琴:http://www.sqlfiddle.com/#!6/d41d8/17317

要仅计算记录,只需将select *替换为select count(*)