sql >> Database teknologi >  >> RDS >> PostgreSQL

Implementering af blokerede datoer for en ORM-model for brugerbegivenheder

Her er den løsning, jeg valgte. Tricket var at bruge left outer join (ruby-kommando eager_load) for brugere og blocked_date_periods-tabellen, og inklusive de brugere, hvis start_date-felt i den sammenføjede tabel er NULL, naturligvis fordi de ikke har nogen blokerede datoobjekter tilknyttet dem selv. Forespørgslen jeg bruger:

User.eager_load(:blocked_date_periods).
  where("blocked_date_periods.start_date is null OR 
    not tsrange(
      blocked_date_periods.start_date - '00:59:59'::interval,
      blocked_date_periods.end_date + '00:59:59'::interval
    ) @> ?::timestamp", 
  Date.parse(DATE_STRING)).count

Jeg var nødt til at tilføje og trække 1 time fra start- og slutdatoen, fordi forespørgslen af ​​en eller anden grund ikke ønskede at omfatte nøjagtige slutdatoer, så 26-12-2015 var ikke inkluderet i perioden fra 22-12-2015 til 16-12-2015 af en eller anden grund mangler jeg endnu at forstå.

Af en eller anden grund kan jeg ikke lide den løsning og vil gerne vide, om der er en forespørgsel, der er bedre og hurtigere end den, jeg har.




  1. mySQL>> Tilføjelse af HREF-links til en Distinct GROUP_CONCAT

  2. Tilføj datetime-begrænsning til et PostgreSQL-flerkolonne delvist indeks

  3. mysql datoformat vedrørende et specifikt land

  4. Emulerer TO_SECONDS() i ældre versioner af MySQL (<5.5.0)