2013-10-24 59 views
2

的最後一天使用SQL Server 2008SQL Server 2008中找到下週五或一個月

基於指定的日期,我需要找到或者下週五或每月的最後一天的日期,如果下週五是在下個月。寧願內聯SQL而不是函數,但會採取我所能得到的。

例子:

對於2013年10月的一個月:

的2013年10月3日一個日期將返回2013年10月4日(下週五)
10日期/ 14/2013將返回2013年10月18日(下週五)
2013年10月25日的日期將返回10/25/2013(這是一個星期五)
2013年10月29日的日期將返回2013年10月31日(下個月的下個月的最後一天是下個月)

+0

看看這一個.. http://stackoverflow.com/questions/5984704/sql-the-sp-or-function-should-calculate-the-next-date-for-friday – AJP

+0

這只是找到下週五。 2013年10月26日將返還11/1/2013。需要它返回10/31/2013。不過謝謝。 – fsu1tm

回答

2

我不是SQL服務器的專家,但這應該讓你關閉。把這個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 

注:代碼審查/評論贊賞。

+0

下一個星期五的第一部分使用@AJP在他的評論中提供的解決方案:http://stackoverflow.com/questions/5984704/sql-the-sp-or-function-should-calculate-the - 下 - 日期爲週五。它在本月的最後一天使用此解決方案:http://stackoverflow.com/questions/16646585/sql-query-to-find-the-last-day-of-the-month。 –

+0

既不工作。在線SQL正在返回星期六,因此我將第一部分更改爲「DATEADD(d,6 - DATEPART(dw,@date),@date)AS Date」(注意6而不是7),但是當我放入日期10/26/2013,它將返回10/25/2013而非10/31/2013。對於函數,當我使用2013年10月26日的日期時,它也會返回10/25/2013。 – fsu1tm

+0

@ user2916205 - 在添加評論之前,我已經注意到了這個問題並加以糾正。它現在就像張貼一樣工作。您發佈的所有四個測試用例都包含在編輯後的答案中,並返回上面提到的相同日期。抱歉給你帶來不便。 –

相關問題