【问题标题】:sql server 2008 find next friday or last day of month [duplicate]sql server 2008查找下一个星期五或一个月的最后一天[重复]
【发布时间】:2013-11-03 08:00:09
【问题描述】:

使用 SQL Server 2008

根据指定的日期,如果下周五在下个月,我需要找到下周五或当月最后一天的日期。与函数相比,更喜欢内联 SQL,但会采取我能得到的。

例子:

2013 年 10 月:

2013 年 10 月 3 日的日期将返回 2013 年 10 月 4 日(下周五)
2013 年 10 月 14 日的日期将返回 2013 年 10 月 18 日(下周五)
2013 年 10 月 25 日的日期将返回 2013 年 10 月 25 日(这是星期五)
2013 年 10 月 29 日的日期将返回 2013 年 10 月 31 日(自下周五起是下个月的一个月的最后一天)

【问题讨论】:

  • 这个是下周五才找到的。对于 2013 年 10 月 26 日,它返回 2013 年 11 月 1 日。需要它在 2013 年 10 月 31 日返回。不过还是谢谢。

标签: sql sql-server


【解决方案1】:

我不是 SQL Server 方面的专家,但这应该会让你很接近。将其放入 SQL 函数中:

DECLARE @date DATETIME = '10/03/2013';

SELECT  MIN(Date) AS NextFridayOrEoMonth
FROM    ( SELECT    DATEADD(DAY, ( CASE DATEPART(DW, @date)
                                     WHEN 7 THEN 6
                                     ELSE 6 - DATEPART(DW, @date)
                                   END ), @date) AS Date
          UNION
          SELECT    DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, @date) + 1, 0)) AS Date
        ) AS dates;

编辑:实际上,这里是作为一个函数。祝你好运!

CREATE FUNCTION dbo.NextFridayOrEoMonth ( @date DATETIME )
RETURNS DATETIME
    WITH SCHEMABINDING,
         RETURNS NULL ON NULL INPUT
AS 
    BEGIN


        DECLARE @result DATETIME;


        SELECT  @result = MIN(Date)
        FROM    ( SELECT    DATEADD(DAY, ( CASE DATEPART(DW, @date)
                                             WHEN 7 THEN 6
                                             ELSE 6 - DATEPART(DW, @date)
                                           END ), @date) AS Date
                  UNION
                  SELECT    DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, @date) + 1, 0)) AS Date
                ) AS dates;

        RETURN @result;
    END
GO  

SELECT  dbo.NextFridayOrEoMonth('10/3/2013') AS NextFridayOrEoMonth; -- 2013-10-04
SELECT  dbo.NextFridayOrEoMonth('10/5/2013') AS NextFridayOrEoMonth; -- 2013-10-11
SELECT  dbo.NextFridayOrEoMonth('10/14/2013') AS NextFridayOrEoMonth; -- 2013-10-18
SELECT  dbo.NextFridayOrEoMonth('10/25/2013') AS NextFridayOrEoMonth; -- 2013-10-25
SELECT  dbo.NextFridayOrEoMonth('10/26/2013') AS NextFridayOrEoMonth; -- 2013-10-31
SELECT  dbo.NextFridayOrEoMonth('10/29/2013') AS NextFridayOrEoMonth; -- 2013-10-31
GO

注意:感谢代码审查/cmets。

【讨论】:

  • 第一部分,下周五,使用@AJP 在他的评论中提供的解决方案:stackoverflow.com/questions/5984704/…。它在该月的最后一天使用此解决方案:stackoverflow.com/questions/16646585/…
  • 都不工作。内联 SQL 在星期六返回,所以我将第一部分更改为“DATEADD(d, 6 - DATEPART(dw, @date), @date) AS Date”(注意 6 而不是 7)但是当我输入日期为 2013 年 10 月 26 日,它返回 2013 年 10 月 25 日而不是 2013 年 10 月 31 日。对于该函数,当我使用 2013 年 10 月 26 日的日期时,它也返回 10/25/2013。
  • @user2916205 - 在您添加评论之前,我已经注意到了这个问题并更正了它。它现在可以像发布的那样工作。您发布的所有四个测试用例都包含在编辑后的答案中,并返回您上面提到的相同日期。很抱歉给您带来不便。
  • 我再次尝试了内联和函数。使用 10/5/2013 时,两者都返回 10/4/2013 而不是 10/11/2013。
  • @fsu1tm 大声笑,你不断想出更多的测试日期!抱歉,我只是在轻松回答人们的 SQL 问题。我没有进行生产级别的测试,但是好的……这是一个最终更新,解决了这篇文章中到目前为止的所有日期。该函数已更新以包含我得到的输出,因此您可以并排比较。
猜你喜欢
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多