PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Uzyskaj czas ze strefą czasową z czasu bez strefy czasowej i nazwy strefy czasowej

UWAGA:nowicjusz PostgreSQL (zobacz komentarze do pytania!). Wiem jednak trochę o strefach czasowych, więc wiem, co ma sens zapytać.

Wygląda na to, że jest to w zasadzie nieobsługiwana sytuacja (niestety), jeśli chodzi o AT TIME ZONE . Patrząc na W STREFIE CZASOWEJ dokumentacja zawiera tabelę, w której są tylko typy wartości „wejściowych”:

  • sygnatura czasowa bez strefy czasowej
  • sygnatura czasowa ze strefą czasową
  • czas ze strefą czasową

Brakuje tego, którego szukasz:czas bez strefa czasowa. To, o co pytasz, to trochę logiczne, chociaż zależy to od daty... ponieważ różne strefy czasowe mogą mieć różne przesunięcia w zależności od daty. Na przykład 12:00:00 Europa/Londyn maj oznacza 12:00:00 UTC lub może oznaczać 11:00:00 UTC, w zależności od tego, czy jest zima czy lato.

W moim systemie, po ustawieniu strefy czasowej systemu na Ameryka/Regina, zapytanie

SELECT ('2011-11-22T12:00:00'::TIMESTAMP WITHOUT TIME ZONE) 
                               AT TIME ZONE 'America/Vancouver'

daje mi 2011-11-22 14:00:00-06 w rezultacie. To nie jest idealne , ale przynajmniej daje moment w czasie (chyba). Wierzę, że jeśli pobrałeś to za pomocą biblioteki klienta - lub porównałeś z innym TIMESTAMP WITH TIME ZONE - uzyskasz właściwy wynik. To tylko konwersja tekstu, która następnie korzysta z systemu strefa czasowa wyjścia.

Czy to by ci wystarczyło? Czy możesz zmienić swój SCHEDULES.time? pole, które będzie TIMESTAMP WITHOUT TIME ZONE pole lub (w czasie zapytania) połączyć czas z pola z datą, aby utworzyć znacznik czasu bez strefy czasowej?

EDYCJA:Jeśli jesteś zadowolony z „bieżącej daty”, wygląda tak jak możesz po prostu zmienić zapytanie na:

SELECT (current_date + SCHEDULES.time) AT TIME ZONE USERS.tz
from SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID

Oczywiście obecny system data może nie być taka sama jak bieżąca data w lokalnej strefie czasowej . myślę to naprawi tę część...

SELECT ((current_timestamp AT TIME ZONE USERS.tz)::DATE + schedules.time)
       AT TIME ZONE USERS.tz
from SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID

Innymi słowy:

  • Weź bieżącą chwilę
  • Opracuj lokalną datę/godzinę w strefie czasowej użytkownika
  • Weź datę tego
  • Dodaj czas harmonogramu do tej daty, aby uzyskać TIMESTAMP WITHOUT TIME ZONE
  • Użyj AT TIME ZONE aby zastosować strefę czasową do lokalnej daty/czasu

Jestem pewien, że jest lepszy sposób, ale myślę to ma sens.

Należy jednak pamiętać, że w niektórych przypadkach może to się nie udać:

  • Jaki ma być wynik dla godziny 01:30 w dniu, w którym zegar przeskakuje z 01:00 na 02:00, więc 01:30 w ogóle nie występuje?
  • Jaki ma być wynik dla godziny 01:30 w dniu, w którym zegar cofa się z 02:00 na 01:00, więc 01:30 występuje dwa razy?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. przechowywanie więcej niż 255 znaków w bazie danych PostgreSQL na heroku

  2. Jak mogę przechowywać kod HTML w polu tabeli Postgresql DB?

  3. PostgreSQL - warunkowe porządkowanie

  4. Dołącz do zapytania licznika w generate_series() i pobierz wartości Null jako „0”

  5. Zrozumienie indeksów bitmapowych w postgresql