2015-10-12 7 views
6

Ich möchte den vorherigen Dienstag (oder einen beliebigen Tag der Woche) für das angegebene Datum erhalten. Hier ist die Probeneingabe und erwartete Ausgabe für Dienstag:Holen Sie sich den vorherigen Dienstag (oder einen beliebigen Wochentag) für das angegebene Datum

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/??? 

Was ist die am besten geeignete Art und Weise des vorherige Dienstag (oder an irgendeinem Tag der Woche) mit T-SQL zu bekommen?

+0

Mögliche Duplikat [Wie bekommt man die „Woche Startdatum“ und „Woche Enddatum“ von Woche Nummer in SQL Server?] (https://stackoverflow.com/questions/1267126/how-do-you-get-the-week-start-date-and-week-end-date-from-week-number-in-sql) –

Antwort

5

ich hoffe, das wird Ihnen helfen,

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

OR

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 

OUTPUT unter Formiat in

Saturday 
Tuesday 10/06/2015 

Bemerkung würde: Die ganze Frage ist nur Kombination und Berechnung von DATEFIRST, DATEPART und DATEADD

+0

@SalmanA 'DATEFIRST' gibt den ersten Tag der Woche an. Der US-Englisch-Standard ist 7, Sonntag. 'DATEPART' Gibt eine Ganzzahl zurück, die den angegebenen Datumsteil des angegebenen Datums darstellt. 'DATEADD' Gibt ein spezifiziertes Datum mit dem angegebenen Nummernintervall (signed integer) zurück, das zu einem bestimmten Datumsteil dieses Datums hinzugefügt wurde. Die ganze Abfrage nur Kombination und Berechnung der Zeit – wiretext

0

Sie können Anzahl der Woche erhalten, indem DATEPART und anschließend CASE Anweisung in folgenden:

:

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 

Kommentar @jpw accoring Sie DATEFIRST bis 7 (default) in folgenden gesetzt haben

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

Die eine Zeit zu manipulieren Am effektivsten ist die Verwendung von DATEADD und DATEDIFF:

Dies ist der gesamte Code Sie benötigen, ist es auch für andere Wochentage

DECLARE @daystoadd int = 1 -- tuesday 


SELECT DATEADD(week, datediff(d, @daystoadd, testdate)/7, @daystoadd) 
FROM #temp 
Verwandte Themen