2013-06-13 6 views
5

Ich möchte dies in Teradata zur Arbeit kommen:Wie Datum/Uhrzeit Komponenten mit einem berechneten Intervall hinzufügen/subtrahieren?

aktualisiert SQL für besseres Beispiel

select 
case 
    when 
     current_date between 
     cast('03-10-2013' as date format 'mm-dd-yyyy') and 
     cast('11-03-2013' as date format 'mm-dd-yyyy') 
    then 4 
    else 5 
end Offset, 
(current_timestamp + interval Offset hour) GMT 

Allerdings habe ich einen Fehler von Expected something like a string or a Unicode character blah blah bekommen. Es scheint, dass Sie das Intervall so zu codieren haben:

select current_timestamp + interval '4' day 

Ja, ich weiß, dass ich es in meinem ersten Beispiel fest einprogrammiert, aber das war nur ein berechnetes Ergebnis zu demonstrieren.

Wenn Sie wissen müssen, muss ich alle Daten und Zeiten in ein paar Tabellen in GMT konvertieren, aber ich muss die Sommerzeit berücksichtigen. Ich bin in Eastern, also muss ich 4 Stunden addieren, wenn das Datum innerhalb des DST-Zeitrahmens ist und 5 Stunden sonst addieren.

Ich weiß, ich kann nur separate Update-Anweisungen für jede Periode erstellen und ändern Sie einfach den Wert von 4 bis 5, aber ich möchte meine Abfrage dynamisch und intelligent sein.

Antwort

2

Hier ist die Lösung:

select 
case 
    when 
     current_date between 
     cast('03-10-2013' as date format 'mm-dd-yyyy') and 
     cast('11-03-2013' as date format 'mm-dd-yyyy') 
    then 4 
    else 5 
end Offset, 
(current_timestamp + cast(Offset as interval hour)) GMT 

Sie müssen tatsächlich der Fall Aussage Rückgabewert als ein Intervall gegossen. Ich wusste nicht mal Intervall-Typen in Teradata. Dank dieser Seite für die Hilfe an:

http://www.teradataforum.com/l081007a.htm

3

Wenn ich richtig verstehe, möchten Sie das Intervall mit einer Zahl multiplizieren. Glauben Sie es oder nicht, das ist buchstäblich alles, was Sie tun müssen:

select current_timestamp     as right_now 
     , right_now +  (interval '1' day) as same_time_tomorrow 
     , right_now + (2 * (interval '1' day)) as same_time_next_day 

Intervalle haben mich immer aus irgendeinem Grund herausgefordert; Ich benutze sie nicht sehr oft. Aber ich hatte dieses kleine Beispiel in meinem Teradata "Spickzettel" für eine ganze Weile.

+0

Ich stimme Ihnen bei der Verwendung von Intervallen zu. Ich kann mich nie erinnern, wie man sie benutzt und muss oft auf einen Spickzettel verweisen. –

+0

Ich möchte den Intervallwert nicht hartcodieren, wie ich in meiner Frage erwähnt habe. Ich habe meine Frage mit einem besseren SQL-Beispiel aktualisiert. Sehen Sie, ob Sie es zur Arbeit bringen können. – oscilatingcretin

+0

Ahhhhaa! Ich habe es herausgefunden. Wird als Antwort posten. – oscilatingcretin

0

Zwei Bemerkungen:

  • Sie ein Intervall anstelle eines INT
  • Die empfohlene Art und Weise schreiben einen Datumsliteral in Teradata zurückkehren konnte ist DATE 'YYYY-MM-DD' statt CAST/FORMAT

    select 
        case 
         when current_date between DATE '2013-03-10' and DATE '2013-11-03' 
         then interval '4' hour 
         else interval '5'hour 
        end AS Offset, 
        current_timestamp + Offset AS GMT 
    
Verwandte Themen