我想從每個月的第一個月開始計算一個月的週數,而不是從週一開始計算。 它需要是第一個。到7日,8日。到14日,15日。到21日,22日。到28日和29日。直到月底。SQL:如何獲取周開始日期和周結束日期
所以如果我通過日期二零一五年十二月三十○日00:00,那麼它應該返回一週的開始日期爲2015年12月29日00:00和星期結束日期爲2016年1月1日00:00
我試過下面的腳本,但它給了我星期一開始的星期一。
我想從每個月的第一個月開始計算一個月的週數,而不是從週一開始計算。 它需要是第一個。到7日,8日。到14日,15日。到21日,22日。到28日和29日。直到月底。SQL:如何獲取周開始日期和周結束日期
所以如果我通過日期二零一五年十二月三十○日00:00,那麼它應該返回一週的開始日期爲2015年12月29日00:00和星期結束日期爲2016年1月1日00:00
我試過下面的腳本,但它給了我星期一開始的星期一。
您可以使用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
OP不能使用EOMONTH,因爲它只是可用於SQL Server 2012和更高版本。 –
的第一步是建立該月的當前星期,在每個月的當天除以給出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
有些晚,但這裏是我使用:
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];
只記得個e BETWEEN
運營商提供了包含日期範圍的[@start, @end]
,所以從技術角度而言,您應該使用@start <= [Date] AND [Date] < @end
或從@end
減去1毫秒 - 無論您在下一週準確記錄下0毫秒的事件,都可以享受1/86,400,000次的機會!
可能出現[獲取星期的開始和結束日期?在Sql服務器?](http://stackoverflow.com/questions/10007861/getting-the-starting-and-ending-date-of-week-in-sql-server) – MusicLovingIndianGirl