/ / postgresql: zapytanie wrażliwe na strefę czasową na znaczniku czasu bez strefy czasowej - postgresql, strefa czasowa, znacznik czasu

postgresql: kwerenda czasowa wrażliwa na znacznik czasu bez strefy czasowej - postgresql, timezone, timestamp

Mam stolik z timestamp without time zone kolumna (zakłada się, że wprowadzono dane Australia/Sydney strefa czasowa).

Zapytanie o dane dla zakresu czasu (tj. 8–16) w America/New_York strefa czasowa.

Czy istnieje prosty sposób na osiągnięcie tego?

dzięki, p.

Odpowiedzi:

3 dla odpowiedzi № 1

Domyśliłam się.

Musisz najpierw przekonwertować czas na to with time zone wersja tj my_ts at time zone "Australia/Sydney" a następnie przekonwertować to na odpowiednik NY poprzez at time zone "America/New_York"

select
my_ts as "Default(syd)",
my_ts at time zone "Australia/Sydney" as "SYD",
my_ts at time zone "Australia/Sydney" at time zone "America/New_York" as "NY",
date_part("hour", my_ts at time zone "Australia/Sydney" at time zone "America/New_York") as "NY-hr"
from my_table
where date_part("hour", my_ts at time zone "Australia/Sydney" at time zone "America/New_York")>=8
and date_part("hour", my_ts at time zone "Australia/Sydney" at time zone "America/New_York")<16

0 dla odpowiedzi nr 2

Możesz przekonwertować wszystko na tę samą strefę czasową, aby móc je porównać (jeśli strefa czasowa została ustawiona):

select current_time, current_time at time zone "gmt";
timetz       |     timezone
-------------------+-------------------
20:50:51.07742-07 | 03:50:51.07742+00

Jeśli strefa czasowa nie jest ustawiona i musisz ją poprawić w czasie lokalnym:

select now()::time, now()::time + "+8:00"::interval;
now       |    ?column?
-----------------+-----------------
20:57:49.420742 | 04:57:49.420742

Gdy znajdziesz czas tak, jak chcesz, po prostu wyodrębnij godzinę i możesz użyć prostego warunku, aby wybrać odpowiednie godziny.

select *
from
(select extract(hour from now()::time + "+8:00"::interval) as hour) as t
where hour between 8 and 16;