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 № 1Domyś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;