sql >> Databáze >  >> RDS >> PostgreSQL

Rails 3.1:Dotazování Postgres na záznamy v časovém rozsahu

Když zavoláte to_date, ztrácíte přehled o svých časových pásmech tak to nedělej:

@today    = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day

Když some_date.to_datetime , získáte instanci DateTime, která je v UTC, takže výsledek je něco takového:

Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime

bude mít denní čas 00:00:00 a časové pásmo UTC; 00:00:00 je správný čas dne v @person.time_zone ale není to vhodné pro UTC (samozřejmě pokud @person je v časovém pásmu +0).

A můžete svůj dotaz zjednodušit pomocí overlaps :

where(
    '(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
    :today => @today, :tomorrow => @tomorrow
)

Všimněte si, že se overlaps pracuje s pootevřenými intervaly:

Každé časové období je považováno za napůl otevřený interval start <= time < end , pokud nejsou začátek a konec stejné, v takovém případě představuje tento jediný časový okamžik.




  1. MySQL NA DUPLIKÁTNÍM KLÍČI – poslední vložené ID?

  2. Asynchronní úlohy s Django a celerem

  3. Časový limit dotazu v pg-promise

  4. Jak zobrazit serverové řazení v SQL Server (T-SQL)