【问题标题】:SQL Server: explanation needed to understand combination of DATEADD and DATEDIFFSQL Server:了解 DATEADD 和 DATEDIFF 组合所需的说明
【发布时间】:2014-04-28 07:31:48
【问题描述】:

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

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

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

--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 nvarchar(4) 并且我插入的表格列被格式化为日期时间 - 也许这是错误的,因为结果应该始终是一个有效的日期?

非常感谢,迈克。

【问题讨论】:

  • @dean - @selyear 出现在看起来像预期日期的位置。如果你将2014 转换为一个日期,你会得到1905-07-08。所以我建议你重复你的测试,但从今年的某个时间点开始使用 @selYear 作为日期时间。
  • 谢谢大家。以上对我来说是正确的——这只是关于如何为其他日期调整它。当然,如果我没有以正确的方式执行此操作,或者只是巧合,请告诉我。结果应始终是有效日期。 :)
  • 我更新了我的帖子 - 请参阅编辑。
  • 嗯,首先要提到的是,我认为显示的查询已损坏 - 从 2100 年开始。据我所知,它有效地计算了与今年具有相同日历的 1900-06 范围内的一年的偏移量,然后将该偏移量应用回那一年以获得正确的日期。但是一旦超过 2100 年,这将不起作用,因为那一年不会是闰年。
  • @Damien_The_Unbeliever:谢谢 - 这与我的需要无关。

标签: sql sql-server date datetime stored-procedures


【解决方案1】:
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

【讨论】:

  • 谢谢。我需要坚持使用与上述内容接近的东西,因为我将不得不在不同的年份和月份使用它。
  • 您可以使用任何年份或月份,假设您想要 2013 年 1 月的星期日,只需将 @date 值更改为“20130101”并将日期转为“星期日”
  • 谢谢,但很抱歉,这对我来说不够灵活,因为我需要在这里计算更长的日期列表。我只需要解释如何修改上述行。
猜你喜欢
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多