2

使用 SQL Server 2008

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

例子:

2013 年 10 月:

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

4

1 回答 1

2

我不是 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

注意: 代码审查/评论表示赞赏。

于 2013-10-24T14:43:07.177 回答