Ответ 1
SELECT
DATEADD(day,DATEDIFF(day,'19000107',DATEADD(month,DATEDIFF(MONTH,0,GETDATE() /*YourValuehere*/),30))/7*7,'19000107')
Изменить: правильный, окончательный, рабочий ответ от моего коллеги.
Как вы найдете последнее воскресенье месяца в sql 2000?
SELECT
DATEADD(day,DATEDIFF(day,'19000107',DATEADD(month,DATEDIFF(MONTH,0,GETDATE() /*YourValuehere*/),30))/7*7,'19000107')
Изменить: правильный, окончательный, рабочий ответ от моего коллеги.
select dateadd(day,1-datepart(dw, getdate()), getdate())
Альтернативный подход, заимствованный из практики хранения данных. Создайте таблицу размеров даты и предварительно загрузите ее в течение 10 лет или около того.
TABLE dimDate (DateKey, FullDate, Day, Month, Year, DayOfWeek,
DayInEpoch, MonthName, LastDayInMonthIndicator, many more..)
Самый простой способ заполнить dimDate
- провести день с помощью Excel и затем импортировать в БД. Полупорядочная таблица dimDate
имеет более 50 столбцов - все, что вы когда-либо хотели узнать о дате.
С этим на месте возникает вопрос:
SELECT max(FullDate)
FROM dimDate
WHERE DayOfWeek = 'Sunday'
AND Month = 11
AND Year = 2009;
По существу, все запросы, связанные с датой, становятся проще.
Следующее воскресенье в SQL, независимо от того, какой день является первым днем недели: возвращает 2011-01-02 23: 59: 59.000 в 22-дек-2010:
select DateADD(ss, -1, DATEADD(week, DATEDIFF(week, 0, getdate()), 14))
DECLARE @LastDateOfMonth smalldatetime
SELECT @LastDateOfMonth = DATEADD(month, DATEDIFF(month, -1, GETDATE()), 0) -1
Select DATEADD(dd,-( CASE WHEN DATEPART(weekday,@LastDateOfMonth) = 1 THEN 0 ELSE DATEPART(weekday,@LastDateOfMonth) - 1 END ),@LastDateOfMonth)
Я считаю, что некоторые из этих решений трудно понять, поэтому здесь моя версия с переменными объясняет шаги.
ALTER FUNCTION dbo.fn_LastSundayInMonth
(
@StartDate DATETIME
,@RequiredDayOfWeek INT /* 1= Sunday */
)
RETURNS DATETIME
AS
/*
A detailed step by step way to get the answer...
SELECT dbo.fn_LastSundayInMonth(getdate()-31,1)
SELECT dbo.fn_LastSundayInMonth(getdate()-31,2)
SELECT dbo.fn_LastSundayInMonth(getdate()-31,3)
SELECT dbo.fn_LastSundayInMonth(getdate()-31,4)
SELECT dbo.fn_LastSundayInMonth(getdate()-31,5)
SELECT dbo.fn_LastSundayInMonth(getdate()-31,6)
SELECT dbo.fn_LastSundayInMonth(getdate()-31,7)
*/
BEGIN
DECLARE @MonthsSince1900 INTEGER
DECLARE @NextMonth INTEGER
DECLARE @DaysToSubtract INTEGER
DECLARE @FirstDayOfNextMonth DATETIME
DECLARE @LastDayOfMonthDayOfWeek INTEGER
DECLARE @LastDayOfMonth DATETIME
DECLARE @ReturnValue DATETIME
SET @MonthsSince1900=DateDiff(month, 0, @StartDate)
SET @[email protected]+1
SET @FirstDayOfNextMonth = DateAdd(month,@NextMonth, 0)
SET @LastDayOfMonth = DateAdd(day, -1, @FirstDayOfNextMonth)
SET @ReturnValue = @LastDayOfMonth
WHILE DATEPART(dw, @ReturnValue) <> @RequiredDayOfWeek
BEGIN
SET @ReturnValue = DATEADD(DAY,-1, @ReturnValue)
END
RETURN @ReturnValue
END
Святая корова, это уродливо, но здесь идет:
DECLARE @dtDate DATETIME
SET @dtDate = '2009-11-05'
SELECT DATEADD(dd, -1*(DATEPART(dw, DateAdd(day, -1, DateAdd(month, DateDiff(month, 0, @dtDate)+1, 0)))-1),
DateAdd(day, -1, DateAdd(month, DateDiff(month, 0, @dtDate)+1, 0)))
Сначала построена табличная таблица. http://www.sqlservercentral.com/articles/T-SQL/62867/ затем получите то, что вы хотите.
http://www.sqlservercentral.com/Forums/Topic515226-1291-1.aspx
DECLARE @DateStart DATETIME,
@DateEnd DATETIME
SELECT @DateStart = '20080131',
@DateEnd = '20101201'
SELECT DATEADD(wk,DATEDIFF(wk,6,DATEADD(mm,DATEDIFF(mm,-1,DATEADD(mm,t.N-1,@DateStart)),-1)),6)
FROM dbo.Tally t
WHERE t.N <= DATEDIFF(mm,@DateStart,@DateEnd)
select next_day(last_day(sysdate)-7, 'Sunday') from dual