2015-10-23 12 views
8

Tôi đang sử dụng đá quý ahoy để theo dõi lượt truy cập và groupdate để hiển thị thống kê hàng ngày.vấn đề gem groupdate với 2 múi giờ cho cùng một cột

Để đếm thăm hàng ngày tôi sử dụng truy vấn này trong Visit mô hình:

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

Nó hoạt động tốt cho đến ngày cuối cùng 18, khi múi giờ của tôi đã thay đổi từ BRT (-03: 00) để BRST (-02: 00).

Bây giờ, các truy vấn trên trả về 0 thăm đếm cho mỗi ngày sau 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 

Nhưng, nếu tôi chỉ chọn 5 ngày qua (mà là tất cả trong múi giờ BRST), nó hoạt động:

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 

Tôi đã thực hiện 2 truy vấn này trực tiếp trong máy chủ mysql và cả hai trả về kết quả chính xác.

tức là khi truy vấn bao gồm các bản ghi với 2 múi giờ khác nhau, groupdate không thể đếm các bản ghi của lần cuối cùng.

Tôi muốn đảm bảo đây là lỗi đá quý groupdate. Hoặc tôi thiếu một cái gì đó?

+0

Tôi lấy nó bạn thấy cái này? https://github.com/ankane/groupdate#time-zones – Anthony

+0

Có @Anthony, múi giờ được định cấu hình chính xác và mọi thứ hoạt động trừ khi 'SELECT' truy lục các bản ghi với hai múi giờ khác nhau. – Rodrigo

Trả lời

1

Tôi tin rằng đó là vì bạn đang làm zero-ing ra HH: mm: ss ở giữa hai convert_tz của

Vui lòng cập nhật SELECT của bạn cho biến những 'ngày':

  1. tháo DATE_FORMAT
  2. đưa toàn bộ điều bên DATE() AS ngày

Và sau đó thay thế GROUP BY giá trị chỉ với: ngày - hoặc bạn có thể sao chép-dán những thay đổi trên vào nhóm theo số

+0

vì SQL này được tạo bởi đá quý groupdate, tôi không thể thay đổi nó. Và, vấn đề không phải là SQL, vì tôi chạy nó trên máy chủ và trả về kết quả đã sửa. – Rodrigo

Các vấn đề liên quan