SQL Server:理解DATEADD和DATEDIFF组合所需的解释

SQL Server:理解DATEADD和DATEDIFF组合所需的解释,sql,sql-server,date,datetime,stored-procedures,Sql,Sql Server,Date,Datetime,Stored Procedures,我对SQL非常陌生,在Select中使用以下几行来获取10月的第一个和最后一个星期一@selYear定义年份 这里有人能告诉我如何调整它,使其返回10月的第二、第三和第四个星期一吗?请给我一个解释,以便我可以在其他日期进一步修改它 我是否需要将第一个公式中的最后0更改为7、14或21,以增加额外的周数? 如果不是星期一,而是星期五或星期四,我会用4或3替换6吗 --1st Monday in October DATEADD(d, DATEDIFF(d, 0, DATEADD(m, 10-1, D

我对SQL非常陌生,在Select中使用以下几行来获取10月的第一个和最后一个星期一@selYear定义年份

这里有人能告诉我如何调整它,使其返回10月的第二、第三和第四个星期一吗?请给我一个解释,以便我可以在其他日期进一步修改它

我是否需要将第一个公式中的最后0更改为7、14或21,以增加额外的周数? 如果不是星期一,而是星期五或星期四,我会用4或3替换6吗

--1st Monday in October
DATEADD(d, DATEDIFF(d, 0, DATEADD(m, 10-1, DATEADD(yy, DATEDIFF(yy, 0, @selYear), 6)))/7*7, 0),
--last Monday in October
DATEADD(d, DATEDIFF(d, 0, DATEADD(m, 10, DATEADD(yy, DATEDIFF(yy, 0, @selYear), 6)))/7*7, -7),
编辑:@selYear在我的例子中定义为@selYear nvarchar4,我插入的表格列格式为datetime-可能这是错误的,因为结果应该始终是有效的日期


谢谢你,迈克

@dean-@selyear出现在预期日期的位置。如果你把2014年定为一个日期,你会得到1905-07-08。因此,我建议重复您的测试,但从今年的某个时候开始使用@selYear作为日期时间。谢谢大家。以上对我来说是正确的-这只是关于如何调整其他日期。当然,如果我没有用正确的方法做这件事,或者这只是巧合,请也让我知道。结果应始终为有效日期:我更新了我的post-see-Edit。首先要提到的是,我认为从2100年开始,显示的查询被破坏了。从我的计算结果来看,它有效地计算了1900-06年范围内与今年日历相同的年份的本年偏移量,然后将该偏移量应用回当年,以获得正确的日期。但一旦我们超过2100年,这就行不通了,因为那一年不会是闰年。@Damien_异教徒:谢谢-这与我的需要无关。谢谢。我需要坚持使用与上述内容相近的内容,因为我必须将其用于不同的年份和月份。您可以使用任何年份或月份,如果您想要2013年1月的周日,只需将@date值更改为“20130101”,将pivot day更改为“Sunday”,谢谢,但很抱歉,这对我来说不够灵活,因为我这里要计算的日期列表更长。我只需要解释一下如何修改上面的行。
declare @date as date = '20141001' -- this is for october 2014
declare @n as int = 0
while (@n<7)
begin
if ((select DATENAME(dw,@date)) = 'Monday') -- write which day you want as pivot 
    break
else
begin
set @n = @n+1
set @date = DATEADD(D,1,@date)
end
end

select @date  first
, DATEADD(D,7,@date)  second    
, DATEADD(D,14,@date) third
, DATEADD(D,21,@date) fourth