2017-12-20 3 views
0

Hallo Ich habe eine temporäre Tabelle von Ergebnissen mit einem Ankunftsdatum und Abreisedatum, die ich auf jeden dritten Tag zwischen der Ankunft und Abreise aktualisieren muss. Hier ist mein Ausgangsql update jeden dritten Tag

output

Die einzige Art, wie ich denken kann, ist DATEADD mit Multiples von 3 zu verwenden, aber die Tage zwischen An- und Abreise können Monate oder sogar Jahre sein, so brauche ich ein Update, das gesetzt jeden dritten Tag, unabhängig davon, wie viele Tage

UPDATE #Report SET "Service" = CASE 
    WHEN Date = DATEADD(DAY,3,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,6,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,9,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,12,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,15,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,18,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,21,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
... 
etc 
ELSE 'Restricted Service' END 

Kann jemand denken Sie an eine Lösung bitte?

Antwort

2

würde ich so etwas wie dies erwartet:

UPDATE #Report 
    SET Service = (CASE WHEN DATEDIFF(day, Arr, Date) % 3 = 0 
         THEN 'Full Service' 
         ELSE 'Restricted Service' 
        END); 

Ich kann nicht ergründen, was die Umstellung auf money ist in Ihrer Version der Abfrage zu tun.

+0

die ursprüngliche Ankunftsdatum, die Zeit enthalten (zB: 09:00:00), meine "Date" -Spalte wurde auf Mitternacht gesetzt, also konvertierte Arr in Geld und dann zurück zu Datetime, um als 00: 00: 00.000 zurückzukommen, also stimmte es überein :) – Kate

+0

Bessere Lösung als meine, aber danke! – Kate

+0

@Kate. . . Sie können einfach zu "Datum" konvertieren, um die Zeitkomponente zu entfernen. –

0

Ich habe eine Lösung gefunden:

Added ein Platz an der Quellentabelle

RANK() OVER (PARTITION BY RoomID ORDER BY Date) AS Ranking 

Divided rank by 3 

UPDATE #x SET Ranking2 = CAST(Ranking AS DECIMAL(20,2))/3 

Update only where this is a whole number 

UPDATE #Report SET "Service" = 
    CASE WHEN FS.Ranking2 = ROUND(FS.Ranking2, 0) THEN 'Full Service' 
    ELSE 'Restricted Service' END 

Bitte lassen Sie mich wissen, ob es einen besseren Weg, obwohl thankyou