sql >> Databasteknik >  >> RDS >> PostgreSQL

Rails 3.1:Fråga efter postgres inom ett tidsintervall

Du tappar koll på dina tidszoner när du ringer to_date så gör inte det:

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

När du some_date.to_datetime , får du en DateTime-instans som är i UTC så resultatet av något i stil med detta:

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

kommer att ha en tid på dagen på 00:00:00 och en tidszon UTC; 00:00:00 är rätt tid på dagen i @person.time_zone men inte rätt för UTC (såvida inte, naturligtvis, @person är i tidszonen +0).

Och du kan förenkla din fråga med overlaps :

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

Observera att overlaps fungerar med halvöppna intervaller:

Varje tidsperiod anses representera halvöppet intervall start <= time < end , såvida inte start och slut är lika i vilket fall det representerar det enstaka tidsögonblicket.




  1. Enkla citattecken, Dubbla citattecken och Backticks i MySQL

  2. Hur man återställer MySQL Galera Cluster från en asynkron slav

  3. MySQL MED klausul

  4. Undvikande enstaka offert i PLSQL