2015-10-12 2 views
6

Я хочу получить предыдущий вторник (или любой день недели) за указанную дату. Здесь входной выборки и ожидаемые результаты на вторник:Получить предыдущий вторник (или любой день недели) на указанную дату

CREATE TABLE #temp(testdate DATETIME); 
INSERT INTO #temp(testdate) VALUES 
    ('2015-10-06 01:15'), -- Tue -> Tue 2015-10-06 00:00 
    ('2015-10-07 04:30'), -- Wed -> Tue 2015-10-06 00:00 
    ('2015-10-08 00:30'), -- Thu -> Tue 2015-10-06 00:00 
    ('2015-10-09 21:00'), -- Fri -> Tue 2015-10-06 00:00 
    ('2015-10-10 19:00'), -- Sat -> Tue 2015-10-06 00:00 
    ('2015-10-11 01:15'), -- Sun -> Tue 2015-10-06 00:00 
    ('2015-10-12 13:00'), -- Mon -> Tue 2015-10-06 00:00 

    ('2015-10-13 18:45'), -- Tue -> Tue 2015-10-13 00:00 
    ('2015-10-14 12:15'), -- Wed -> Tue 2015-10-13 00:00 
    ('2015-10-15 10:45'), -- Thu -> Tue 2015-10-13 00:00 
    ('2015-10-16 04:30'), -- Fri -> Tue 2015-10-13 00:00 
    ('2015-10-17 12:15'), -- Sat -> Tue 2015-10-13 00:00 
    ('2015-10-18 00:30'), -- Sun -> Tue 2015-10-13 00:00 
    ('2015-10-19 10:45'), -- Mon -> Tue 2015-10-13 00:00 

    ('2015-10-20 01:15'), -- Tue -> Tue 2015-10-20 00:00 
    ('2015-10-21 23:45'), -- Wed -> Tue 2015-10-20 00:00 
    ('2015-10-22 21:00'), -- Thu -> Tue 2015-10-20 00:00 
    ('2015-10-23 18:45'), -- Fri -> Tue 2015-10-20 00:00 
    ('2015-10-24 06:45'), -- Sat -> Tue 2015-10-20 00:00 
    ('2015-10-25 06:45'), -- Sun -> Tue 2015-10-20 00:00 
    ('2015-10-26 04:30'); -- Mon -> Tue 2015-10-20 00:00 

DECLARE @clampday AS INT = 3; -- Tuesday 
SELECT -- DATEADD/DATEPART/@clampday/??? 

Что является наиболее подходящим способом, чтобы получить предыдущий вторник (или в любой день недели) с использованием T-SQL?

+0

Возможного дубликат [Как вы получаете «неделю даты начала» и «неделю дату окончания» с номера недели в SQL Server?] (https://stackoverflow.com/questions/1267126/how-do-you-get-the-week-start-date-and-week-end-date-from-week-number-in-sql) –

ответ

5

я надеюсь, что это поможет вам

SELECT DATEADD(day,- (DATEPART(dw, testdate) + @@DATEFIRST - 3) % 7,testdate) AS Saturday 
from #temp 

ИЛИ

SELECT DATENAME(weekday,DATEADD(day,- (DATEPART(dw, testdate) + @@DATEFIRST - 3) % 7,testdate)) +' '+ 
     CONVERT(nvarchar,DATEADD(day,- (DATEPART(dw, testdate) + @@DATEFIRST - 3) % 7,testdate),101) AS Saturday 
from @temp 

ВЫХОД бы в ниже формиата

Saturday 
Tuesday 10/06/2015 

Примечание: весь запрос является лишь сочетание и расчет DATEFIRST, DATEPART и DATEADD манипулировать один раз

+0

@SalmanA 'DATEFIRST' указывает первый день недели. Английский стандарт по умолчанию - 7, воскресенье. 'DATEPART' Возвращает целое число, которое представляет заданную дату в определенную дату. 'DATEADD' Возвращает указанную дату с указанным интервалом числа (целое число со знаком), добавленным к указанной дате части этой даты. Весь запрос только комбинация и расчет времени – wiretext

0

Вы можете использовать получить номер недели с помощью DATEPART, а затем использовать CASE заявление в следующем:

SELECT 
    testdate, 
    CASE DATEPART(dw,testdate) WHEN 1 THEN DATEADD(dd,-5,testdate) 
           WHEN 2 THEN DATEADD(dd,-6,testdate) 
           WHEN 3 THEN DATEADD(dd, 0,testdate) 
           WHEN 4 THEN DATEADD(dd,-1,testdate) 
           WHEN 5 THEN DATEADD(dd,-2,testdate) 
           WHEN 6 THEN DATEADD(dd,-3,testdate) 
           WHEN 7 THEN DATEADD(dd,-4,testdate)          
    END 
FROM #temp 

к @jpw Согласно наблюдениям комментарий, вы должны установить DATEFIRST до 7 (по умолчанию) в следующем:

SET DATEFIRST 7 
0
CREATE PROC FIND_TUESDAY_DATE 
(
@MYDATE DATE 
) 
AS 
BEGIN 
    SELECT CASE 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,0,@MYDATE) AS DATE)) = 'Tuesday' OR DATENAME(DW,CAST(DATEADD(DAY,-7,@MYDATE) AS DATE)) = 'Tuesday' 
      THEN CAST(DATEADD(DAY,-7,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-1,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-1,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-2,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-2,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-3,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-3,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-4,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-4,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-5,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-5,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-6,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-6,@MYDATE) AS DATE) 
     END 
END 
GO 
0

наиболее эффективным способом является использование DATEADD и DATEDIFF:

Это весь код, вам нужно, он также работает в других буднях

DECLARE @daystoadd int = 1 -- tuesday 


SELECT DATEADD(week, datediff(d, @daystoadd, testdate)/7, @daystoadd) 
FROM #temp 
Смежные вопросы