2011-06-22 37 views
6

Tôi bị kẹt. Cần giúp đỡ.Đối phó với UTC, TimeZone và thực hiện GROUP BY trên đó với LocalTime

Tôi lưu trữ ngày UTC trong cơ sở dữ liệu.

hàng ví dụ:

GeneratedAt:

  • 2011-06-08 23:30
  • 2011-06-09 03:30
  • 2011-06-09 15:30

Giờ địa phương cho người dùng của tôi là -2 giờ (Trung Âu). Khi tôi muốn các hàng từ 09 thì tôi có 3 hàng.

Sự cố xảy ra với GROUP BY ngày cho mục đích báo cáo. Tôi có 1 cho 08 và 2 cho 09 nhưng điều này không đúng cho thời gian địa phương của tôi.

Ở mọi nơi tôi thấy: "lưu trữ dữ liệu trong UTC". Làm thế nào để làm điều này đúng cách?

UPDATE 1:
Để truy cập dữ liệu Tôi đang sử dụng NHibernate và tôi thích giải pháp độc lập với cơ sở dữ liệu. Vì vậy, tôi đang tìm giải pháp với một cái gì đó như bảng Ngày/Thời gian Kích thước (hoặc một cái gì đó như thế).

bảng dữ liệu của tôi có các cột như thế này:

  • GeneratedAt (datetime)
  • GeneratedAt_Year (int)
  • GeneratedAt_Month (int)
  • GeneratedAt_Day (int)
  • GeneratedAt_Hour (int)

Nhờ đó tôi có thể dễ dàng g rouping bởi: năm, năm + tháng, năm + tháng + ngày, năm + tháng + ngày + giờ. Thật không may, đây là UTC. :(

Làm thế nào để cấu trúc lại giải pháp này để đối phó với các múi giờ sử dụng?

Trả lời

3

Bạn có thể tạo ra một cái nhìn của bảng mà trong đó cung cấp giá trị datetime trong mong muốn múi giờ Trung Âu bằng cách áp dụng một hàm DATEADD.

vì vậy, nếu cột bảng của bạn là: id, other_id, evt_time

sau đó báo cáo kết quả lựa chọn (đối với định nghĩa khung nhìn) sẽ là:

SELECT id, other_id, evt_time, DATEADD(hh, -2, evt_time) AS evt_time_ce 
    FROM MyTable 

thì bạn có thể sử dụng chế độ xem và áp dụng chế độ xem GROUP_BY vào cột evt_time_ce

+0

này sẽ không làm việc với ánh sáng ban ngày tiết kiệm (đó là đôi khi -2, đôi khi -3). – Carra

2

Tôi có vấn đề tương tự nói chung, nhưng chênh lệch múi giờ của tôi là 8 giờ.

tôi sử dụng dateadd(hour,, [Timestamp]) để chọn thời gian địa phương, và dateadd(hour,-8, @dateFrom) trong mệnh đề WHERE - mà nên làm việc cho GROUP BY là tốt.

Ví dụ:

DECLARE @dateFrom datetime, @dateUntil datetime 
SET @dateFrom = '2011-06-20 00:00:02.000' 
SET @dateUntil = '2011-06-22 10:00:00.000' 

SELECT TOP 100 
    dateadd(hour, 8, [Timestamp]) LocalTime, 
     * 
FROM [Log] L (nolock) 
WHERE L.[Timestamp] BETWEEN dateadd(hour, -8, @dateFrom) AND dateadd(hour, -8, @dateUntil) 
ORDER BY LogID DESC 
+0

Làm thế nào để bạn xử lý hiệu ứng của thời gian tiết kiệm ánh sáng ban ngày trên bù đắp bạn sử dụng để có được LocalTime? – vitaminjeff