有人可以编写SQL查询:
答案 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(*)
。