2015-12-22 478 views
0

我想從每個月的第一個月開始計算一個月的週數,而不是從週一開始計算。 它需要是第一個。到7日,8日。到14日,15日。到21日,22日。到28日和29日。直到月底。SQL:如何獲取周開始日期和周結束日期

所以如果我通過日期二零一五年十二月三十○日00:00,那麼它應該返回一週的開始日期爲2015年12月29日00:00和星期結束日期爲2016年1月1日00:00

我試過下面的腳本,但它給了我星期一開始的星期一。

enter image description here

+0

可能出現[獲取星期的開始和結束日期?在Sql服務器?](http://stackoverflow.com/questions/10007861/getting-the-starting-and-ending-date-of-week-in-sql-server) – MusicLovingIndianGirl

回答

0

您可以使用EOMONTH DATEADD()()。例如。從EOMONTH減去一天,以獲得本月的多少天。

要計算一個月中的多少個星期,請取EOMONTH並將其除以7.使用FLOOR()函數去除餘數。

DECLARE @date DATETIME = GETDATE(); 
SELECT EOMONTH (@date) AS 'This Month'; 
SELECT EOMONTH (@date, 1) AS 'Next Month'; 
SELECT EOMONTH (@date, -1) AS 'Last Month'; 
GO 
+1

OP不能使用EOMONTH,因爲它只是可用於SQL Server 2012和更高版本。 –

1

的第一步是建立該月的當前星期,在每個月的當天除以給出7(四捨五入),然後你就可以得到當前一週的開始之日將週數乘以7並添加一天。最後,您可以使用當前月份的第一個月和DATEADD(DAY獲取一週的開始日期。該階段是:

DECLARE @Date DATE = '2015-12-30'; 

SELECT WeekNumberOfMonth = CEILING(DATEPART(DAY, @Date)/7.0), 
     WeekStartDay = 1 + FLOOR((DATEPART(DAY, @Date) - 1)/7.0) * 7, 
     FirstDayOfMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0), 
     WeekStart = DATEADD(DAY, 
          (CEILING(DATEPART(DAY, @Date)/7.0) - 1) * 7, 
          DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0)); 

其中給出:

WeekNumberOfMonth WeekStartDay FirstDayOfMonth  WeekStart 
-------------------------------------------------------------------- 
5     29    2015-12-01   2015-12-29 

最後,週末需要一個case語句來檢查它是否仍然在同一個月作爲一週的開始:

DECLARE @Date DATE = '2015-12-30'; 

SELECT d.WeekStart, 
     Weekend = CASE WHEN DATEADD(DAY, 7, WeekStart) > StartOfNextMonth 
          THEN StartOfNextMonth 
         ELSE DATEADD(DAY, 7, WeekStart) 
        END 
FROM ( SELECT WeekStart = DATEADD(DAY, 
             ((DATEPART(DAY, @Date) - 1)/7.0) * 7, 
             DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0)), 
        StartOfNextMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date) + 1, 0) 
     ) AS d; 

其中給出:

WeekStart  Weekend 
---------------------------- 
2015-12-29  2016-01-01 

進一步測試

SELECT d.[Date], 
     d.WeekStart, 
     Weekend = CASE WHEN DATEADD(DAY, 7, WeekStart) > StartOfNextMonth 
          THEN StartOfNextMonth 
         ELSE DATEADD(DAY, 7, WeekStart) 
        END 
FROM ( SELECT dt.[Date], 
        WeekStart = DATEADD(DAY, 
             (CEILING(DATEPART(DAY, dt.[Date])/7.0) - 1) * 7, 
             DATEADD(MONTH, DATEDIFF(MONTH, 0, dt.[Date]), 0)), 
        StartOfNextMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, dt.[Date]) + 1, 0) 
      FROM (VALUES 
         (CONVERT(DATE, '20151106')), 
         (CONVERT(DATE, '20151107')), 
         (CONVERT(DATE, '20151220')), 
         (CONVERT(DATE, '20151228')), 
         (CONVERT(DATE, '20151230')), 
         (CONVERT(DATE, '20160104')) 
        ) dt ([Date]) 
     ) AS d; 

輸出

Date   WeekStart  Weekend 
------------------------------------------- 
2015-11-06  2015-11-01  2015-11-08 
2015-11-07  2015-11-01  2015-11-08 
2015-12-20  2015-12-15  2015-12-22 
2015-12-28  2015-12-22  2015-12-29 
2015-12-30  2015-12-29  2016-01-01 
2016-01-04  2016-01-01  2016-01-08 
+0

嗨@GarethD當我通過日期'2015-12-20 00:00'時,它會返回WeekStart:2015-12-15 00:00:00.000和WeekEnd 2015-12-21 00:00:00.000。理想情況WeekEnd應該是2015-12-22 00:00:00.000 – punter

+0

我編輯了答案來做到這一點。 – GarethD

+0

謝謝..完美! – punter

0

有些晚,但這裏是我使用:

DECLARE @now datetime = GETDATE(); 

-- strip the time part from your date 
DECLARE @date datetime = CONVERT(date, @now); 

-- do the day of week math 
DECLARE @start datetime = DATEADD(d, 1 - DATEPART(w, @date), @date), 
     @end datetime = DATEADD(d, 8 - DATEPART(w, @date), @date); 

SELECT @start AS [WeekStart], @now AS [Now], @end AS [WeekEnd]; 

SQL Week start and end from date

只記得個e BETWEEN運營商提供了包含日期範圍的[@start, @end],所以從技術角度而言,您應該使用@start <= [Date] AND [Date] < @end或從@end減去1毫秒 - 無論您在下一週準確記錄下0毫秒的事件,都可以享受1/86,400,000次的機會!

相關問題