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?