2013-06-13 28 views
5

chciałbym uzyskać to do pracy w Teradata:Jak dodawać/odejmować składniki daty/czasu za pomocą obliczonego przedziału czasu?

Aktualizacja SQL dla lepszego przykładu

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 

jednak otrzymuję błąd Expected something like a string or a Unicode character blah blah. Wydaje się, że trzeba zakodować interwał takiego:

select current_timestamp + interval '4' day 

Tak, wiem, że ustalony w moim pierwszym przykładzie, ale to było tylko wykazać obliczony wynik.

Jeśli musisz wiedzieć, muszę zamienić wszystkie daty i godziny w kilku tabelach na GMT, ale muszę uwzględnić czas letni. Jestem na wschodzie, więc muszę dodać 4 godziny, jeśli data jest w terminie DST i dodać 5 godzin w przeciwnym razie.

Wiem, że mogę po prostu utworzyć osobne instrukcje aktualizacji dla każdego okresu i zmienić odpowiednio wartość z 4 na 5, ale chcę, aby moje zapytanie było dynamiczne i inteligentne.

Odpowiedz

2

Oto rozwiązanie:

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 

Trzeba rzeczywiście rzucić wartości zwracanej przez case jako odstępie. Nie wiedziałem nawet, jakie typy interwałów istnieją w Teradata. Dzięki tej stronie za pomoc przy:

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

3

Jeśli dobrze rozumiem, należy pomnożyć przedział przez pewną liczbę. Wierzcie lub nie, to dosłownie wszystko, co musicie zrobić:

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 

Odstępy zawsze prowokowały mnie z jakiegoś powodu; Nie używam ich bardzo często. Ale przez krótki czas miałem ten mały przykład w mojej "karcie do ściągania" Teradaty.

+0

Zgadzam się z Państwem w sprawie wykorzystania odstępów czasu. Nigdy nie pamiętam, jak z nich korzystać i często muszę się odwoływać do kartki. –

+0

Nie chcę kodować wartości interwałów, o których pisałem w moim pytaniu. Zaktualizowałem moje pytanie z lepszym przykładem SQL. Sprawdź, czy możesz go uruchomić. – oscilatingcretin

+0

Ahhhhaa! Rozgryzłem to. Zostanie opublikowana jako odpowiedź. – oscilatingcretin

0

dwie uwagi:

  • Ty mógł wrócić odstępie zamiast INT
  • Zalecanym sposobem napisać datę dosłowne w Teradata DATE 'RR-MM-DD' zamiast 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