2015-10-23 8 views
8

sto usando le gemme Ahoy per monitorare le visite e groupdate per mostrare le statistiche quotidiane.gemma problema groupdate con 2 fusi orari per stessa colonna

a contare visite giornaliere Io uso questa query in Visit modello:

Visit.group_by_day(:started_at).order('started_at').count 

Ha funzionato bene fino all'ultimo giorno 18, quando il mio fuso orario cambiato da BRT (-03: 00) per BRST (-02: 00).

Ora, query precedente restituisce contano 0 visite per ogni giorno dopo 18:

2.1.3 :026 > puts Visit.group_by_day(:started_at).order('started_at desc').limit(10).count.to_yaml 
    (0.3ms) SELECT COUNT(*) AS count_all, DATE_ADD(CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(started_at, INTERVAL 0 HOUR), '+00:00', 'America/Sao_Paulo'), '%Y-%m-%d 00:00:00'), 'America/Sao_Paulo', '+00:00'), INTERVAL 0 HOUR) AS day FROM `visits` WHERE (started_at IS NOT NULL) GROUP BY DATE_ADD(CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(started_at, INTERVAL 0 HOUR), '+00:00', 'America/Sao_Paulo'), '%Y-%m-%d 00:00:00'), 'America/Sao_Paulo', '+00:00'), INTERVAL 0 HOUR) ORDER BY started_at desc LIMIT 10 
--- 
2015-10-14 03:00:00.000000000 Z: 158 
2015-10-15 03:00:00.000000000 Z: 127 
2015-10-16 03:00:00.000000000 Z: 101 
2015-10-17 03:00:00.000000000 Z: 112 
2015-10-18 03:00:00.000000000 Z: 111 
2015-10-19 03:00:00.000000000 Z: 0 
2015-10-20 03:00:00.000000000 Z: 0 
2015-10-21 03:00:00.000000000 Z: 0 
2015-10-22 03:00:00.000000000 Z: 0 

Ma, se seleziono solo gli ultimi 5 giorni (che sono tutti nel fuso orario BRST), funziona:

2.1.3 :027 > puts Visit.group_by_day(:started_at).order('started_at desc').limit(5).count.to_yaml 
    (0.3ms) SELECT COUNT(*) AS count_all, DATE_ADD(CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(started_at, INTERVAL 0 HOUR), '+00:00', 'America/Sao_Paulo'), '%Y-%m-%d 00:00:00'), 'America/Sao_Paulo', '+00:00'), INTERVAL 0 HOUR) AS day FROM `visits` WHERE (started_at IS NOT NULL) GROUP BY DATE_ADD(CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(started_at, INTERVAL 0 HOUR), '+00:00', 'America/Sao_Paulo'), '%Y-%m-%d 00:00:00'), 'America/Sao_Paulo', '+00:00'), INTERVAL 0 HOUR) ORDER BY started_at desc LIMIT 5 
--- 
2015-10-19 02:00:00.000000000 Z: 85 
2015-10-20 02:00:00.000000000 Z: 72 
2015-10-21 02:00:00.000000000 Z: 84 
2015-10-22 02:00:00.000000000 Z: 80 
2015-10-23 02:00:00.000000000 Z: 21 

ho fatto queste 2 domande direttamente a server MySQL, ed entrambe le dichiarazioni dei risultati corretti.

vale a dire, quando la query copre record con 2 fusi orari diversi, groupdate non può contare i record dell'ultimo.

Voglio assicurarmi che questo sia un bug della gemma di gruppo. O mi manca qualcosa?

+0

Immagino che tu l'abbia visto? https://github.com/ankane/groupdate#time-zones – Anthony

+0

Sì @Anthony, il fuso orario è configurato correttamente e tutto funziona tranne quando 'SELECT' recupera i record con due diversi fusi orari. – Rodrigo

risposta

1

Credo che sia perché si sta facendo a zero-ing l'hh: mm: ss tra i due del convert_tz

Si prega di aggiornare il vostro prescelto per il 'giorno' variabile:

  1. rimuovere il DATE_FORMAT
  2. mettere il tutto dentro DATA() AS giorno

e quindi sostituire il GROUP BY valore con un solo: giorno - oppure è possibile copiare e incollare i cambiamenti di cui sopra nel group by

+0

poiché questo SQL è generato da groupdate gem, non posso cambiarlo. E, il problema non è l'SQL, perché l'ho eseguito sul server e restituito risultati corretti. – Rodrigo