2011-06-22 14 views
6

के साथ ग्रुप बना रहा है। मैं अटक गया हूं। मदद चाहिए।यूटीसी, टाइमज़ोन से निपटने और उस पर ग्रुपटाइम

मैं डेटाबेस में यूटीसी तिथियों को स्टोर करता हूं।

उदाहरण पंक्तियाँ:

GeneratedAt:

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

मेरे उपयोगकर्ता के लिए स्थानीय समय -2 घंटे (मध्य यूरोप) है। जब मैं 0 से पंक्तियां चाहता हूं तो मेरे पास 3 पंक्तियां हैं।

समस्या रिपोर्टिंग उद्देश्यों के लिए समूह द्वारा दिन के साथ समस्या है। मेरे पास 0 के लिए 08 और 2 के लिए 1 है लेकिन यह मेरे स्थानीय समय के लिए सच नहीं है।

हर जगह मैं देखता हूं: "यूटीसी में डेटा संग्रह करें"। यह ठीक से कैसे करें?

अद्यतन 1:
डेटा का उपयोग के लिए मैं NHibernate उपयोग कर रहा हूँ और मैं समाधान डेटाबेस इंजन के स्वतंत्र पसंद करते हैं। तो, मैं दिनांक/समय आयाम तालिका (या ऐसा कुछ) जैसे समाधान के साथ समाधान की तलाश में हूं।

मेरे डेटा तालिका इस तरह स्तंभ हैं:

  • GeneratedAt (दिनांक)
  • GeneratedAt_Year (int)
  • GeneratedAt_Month (int)
  • GeneratedAt_Day (int)
  • GeneratedAt_Hour (पूर्णांक)

धन्यवाद कि मैं आसानी से जी द्वारा रौपिंग: वर्ष, वर्ष + महीना, वर्ष + महीना + दिन, वर्ष + महीना + दिन + घंटा। दुर्भाग्य से यह यूटीसी है। :(

कैसे उपयोगकर्ता समय क्षेत्र से निपटने के लिए इस समाधान refactor करने के लिए?

उत्तर

3

आप देखेंगे कि तालिका जो एक DATEADD समारोह लगाने से वांछित मध्य यूरोप समय क्षेत्र में datetime मूल्य प्रदान करता है के एक दृश्य बना सकते हैं।

इसलिए यदि आपके तालिका स्तंभ हैं: id, other_id, evt_time

तो चुनिंदा बयान (देखें परिभाषा के लिए) होगा:

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

तो आप GROUP_BY को evt_time_ce कॉलम

+0

यह डेलाइट सेविंग साथ काम नहीं करेंगे (यह कभी कभी है -2, कभी कभी -3)। – Carra

2

पर सामान्य रूप से एक समान समस्या है, लेकिन मेरा समय अंतर 8 घंटे है।

मैं dateadd(hour,, [Timestamp]) का उपयोग स्थानीय समय का चयन करने के लिए, और dateadd(hour,-8, @dateFrom) में कहां खंड - जो रूप में अच्छी तरह द्वारा समूह के लिए काम करना चाहिए।

उदाहरण के लिए:

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

आप स्थानीय समय प्राप्त करने के लिए उपयोग किए जाने वाले ऑफ़सेट पर डेलाइट बचत समय के प्रभाव को कैसे संभालेंगे? – vitaminjeff

संबंधित मुद्दे