текущая Как получить последний день прошлой недели в sql?




sql первый день месяца (8)

Как получить последнюю дату последнего времени в sql? Я имею в виду последнюю дату воскресенья с использованием запроса?


Чтобы получить предыдущее воскресенье, или сегодня, если сегодня воскресенье, попробуйте это

DATEADD(day,- (DATEPART(dw,getdate()) + @@DATEFIRST -1) % 7, getdate())

В прошлое воскресенье ( каков конец «на прошлой неделе» )

SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6) AS LAST_SUNDAY

На этой неделе ( Предполагая формат недели в формате Sun-Sun )

SELECT DATEADD(wk, DATEDIFF(wk, 7, CURRENT_TIMESTAMP), 7) AS START_OF_WEEK
SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6 + 7) AS END_OF_WEEK

Результаты

START_OF_WEEK
-----------------------
2011-05-02 00:00:00.000

END_OF_WEEK
-----------------------
2011-05-08 00:00:00.000

Примеры для объяснения voodoo ( используйте это, чтобы изменить выше SQL на желаемую начальную неделю и недельный день недели )

  • В приведенных ниже примерах найдите дни недели в течение текущей недели (с воскресенья по субботу)
  • Если фактическая END_OF_WEEK следующая неделя Sun-Sat, то вам нужно довести значение на этой неделе до +7. (См. Пример END_OF_WEEK выше.)

SQL ниже

SELECT DATEADD(wk, DATEDIFF(wk, -2, CURRENT_TIMESTAMP), -2) AS DAY_OF_WEEK /* Saturday */
SELECT DATEADD(wk, DATEDIFF(wk, -1, CURRENT_TIMESTAMP), -1) AS DAY_OF_WEEK /* Sunday */
SELECT DATEADD(wk, DATEDIFF(wk, 0, CURRENT_TIMESTAMP), 0) AS DAY_OF_WEEK /* Monday */
SELECT DATEADD(wk, DATEDIFF(wk, 1, CURRENT_TIMESTAMP), 1) AS DAY_OF_WEEK /* Tuesday */
SELECT DATEADD(wk, DATEDIFF(wk, 2, CURRENT_TIMESTAMP), 2) AS DAY_OF_WEEK /* Wednesday */
SELECT DATEADD(wk, DATEDIFF(wk, 3, CURRENT_TIMESTAMP), 3) AS DAY_OF_WEEK /* Thursday */
SELECT DATEADD(wk, DATEDIFF(wk, 4, CURRENT_TIMESTAMP), 4) AS DAY_OF_WEEK /* Friday */
SELECT DATEADD(wk, DATEDIFF(wk, 5, CURRENT_TIMESTAMP), 5) AS DAY_OF_WEEK /* Saturday */
SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6) AS DAY_OF_WEEK /* Sunday */
SELECT DATEADD(wk, DATEDIFF(wk, 7, CURRENT_TIMESTAMP), 7) AS DAY_OF_WEEK /* Monday */
SELECT DATEADD(wk, DATEDIFF(wk, 8, CURRENT_TIMESTAMP), 8) AS DAY_OF_WEEK /* Tuesday */
SELECT DATEADD(wk, DATEDIFF(wk, 9, CURRENT_TIMESTAMP), 9) AS DAY_OF_WEEK /* Wednesday */
SELECT DATEADD(wk, DATEDIFF(wk, 10, CURRENT_TIMESTAMP), 10) AS DAY_OF_WEEK /* Thursday */
SELECT DATEADD(wk, DATEDIFF(wk, 11, CURRENT_TIMESTAMP), 11) AS DAY_OF_WEEK /* Friday */
SELECT DATEADD(wk, DATEDIFF(wk, 12, CURRENT_TIMESTAMP), 12) AS DAY_OF_WEEK /* Saturday */
etc...

Независимо от фактической настройки DATEFIRST, последнее воскресенье можно найти следующим образом:

SELECT DATEADD(day,
               -1 - (DATEPART(weekday, GETDATE()) + @@DATEFIRST - 2) % 7,
               GETDATE()
              ) AS LastSunday

Замените GETDATE() параметром @date чтобы получить последнее воскресенье до определенной даты.


SQL является более простым с подходящей таблицей календаря. Нет вуду.

select max(cal_date) end_of_last_week
from calendar
where (cal_date < current_date and day_of_week = 'Sun');

end_of_last_week
--
2011-05-01


Вот код, чтобы получить дату прошлой субботы. Этот метод не зависит от настроек базы данных.

declare @lastSaturday date,
        @today date,
        @todayName varchar(20);

select  @todayName = datename(weekday, getdate()), @today = getdate();

select  
            case @todayName 
                when 'Saturday' then @today
                when 'Sunday' then dateadd(day,-1,@today)
                when 'Monday' then dateadd(day,-2,@today)
                when 'Tuesday' then dateadd(day,-3,@today)
                when 'Wednesday' then dateadd(day,-4,@today)
                when 'Thursday' then dateadd(day,-5,@today)
                when 'Friday' then dateadd(day,-6,@today)
            end  as LastSaturday;

DECLARE @LastSunday DATETIME 

-- This will get the previous Sunday with time as 23:59:59 
SELECT @LastSunday = Dateadd(SECOND, -1, Dateadd(WK, Datediff(WK, 6, 
                                                     CURRENT_TIMESTAMP) 
                                                , 7)) 

SELECT @LastSunday 

-- This gets the monday prior to it and time of 00:00:00 
SELECT Dateadd(SECOND, 1, Dateadd(DAY, -7, @LastSunday)) 
-- This will make you time spans between eg, Monday 16/07/2012 00:00:00 through to Sunday 22/07/2012 23:59:59
-- Then use them in your WHERE clause like this 
-- SELECT X,Y,Z From SomeTable 
-- WHERE DateField BETWEEN @PreviousMondayToLastSunday AND @LastSunday 

SELECT (DATEADD(DAY, ((DATEPART(dw, @Date) - 1) * -1), @Date))






tsql