سؤال

سيتم نشر تطبيق قاعدة البيانات الخاص بي في مواقع متعددة في مناطق زمنية مختلفة.

أحتاج إلى وظيفة T-SQL التي ستحدد الطابع الزمني UTC لمنتصف الليل في 1 يناير من العام الحالي لحسابات منذ بداية العام.يتم تخزين كافة البيانات في الطوابع الزمنية UTC.

على سبيل المثال، شيكاغو هي UTC-6 مع التوقيت الصيفي (DST)، وتحتاج الدالة إلى إرجاع "2008-01-01 06:00:00" إذا تم تشغيلها في أي وقت في عام 2008 في شيكاغو.إذا تم تشغيله في نيويورك (GMT-5 + DST) العام المقبل، فيجب إرجاع "2009-01-01 05:00:00".

يمكنني الحصول على العام الحالي من YEAR(GETDATE()).اعتقدت أنني أستطيع أن أفعل DATEDIFF بين GETDATE() و GETUTCDATE() لتحديد الإزاحة ولكن النتيجة تعتمد على ما إذا كان يتم تشغيل الاستعلام أثناء التوقيت الصيفي أم لا.لا أعرف أي وظائف T-SQL مضمنة لتحديد الإزاحة أو ما إذا كان الوقت الحالي هو التوقيت الصيفي أم لا؟

هل لدى أي شخص حل لهذه المشكلة في T-SQL؟يمكنني ترميزها أو تخزينها في جدول ولكني أفضل عدم القيام بذلك.أفترض أن هذا هو الوضع المثالي لاستخدام تكامل CLR في SQL Server 2005.أنا فقط أتساءل عما إذا كان هناك حل T-SQL لست على علم به؟

هل كانت مفيدة؟

المحلول

وتحقق من هذا السؤال السابق والإجابة عن المعلومات ذات الصلة:

فعال تحويل التواريخ بين UTC والتوقيت المحلي (أي. PST) في SQL 2005

(وباختصار، كنت بحاجة لبناء المنطقة الزمنية والجداول DST في SQL Server 2005. في الإصدار التالي من SQL Server نحصل على بعض المساعدة مع المناطق الزمنية.)

نصائح أخرى

واذا لم اكن مخطئا، يستخدم الدالة GETUTCDATE () منطقة زمنية محددة على الخادم - أنه لا يمتلك أي معلومات بشأن المنطقة الزمنية العميل (أو أي منطقة زمنية). لا أعتقد أن يتم تخزين المعلومات في أي مكان في SQL Server 2005، الأمر الذي يجعل من المستحيل بالنسبة لحساب هذه المعلومات.

وربما كنت قد "الاقتراض" البيانات من <لأ href = "http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch4datetime.htm#i1006667" يختلط = "noreferrer نوفولو "> أوراكل وقت ملف المنطقة و بناء الخاصة ظيفة SQL الخادم الخاص بك؟

وتخرج عن الموضوع (يمكن أن تكون مفيدة لشخص آخر)، ولكن إذا كنت تستخدم أوراكل، يمكنك استخدام وظيفة FROM_TZ و "AT TIME ZONE ':

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'

حسنًا، أعتقد أنني لا أفهم المشكلة.إذا كان تطبيق قاعدة البيانات يقوم بالفعل بتخزين الطوابع الزمنية لتوقيت UTC لجميع معاملاته، وتريد تلخيص بعض القيم منذ أول العام "بالتوقيت المحلي"، فيجب أن تكون حالتك شيئًا مثل:

(timestamp + (getutcdate() - getdate())) > cast('01/01/2008' as datetime)

يمكن أن يكون التوقيت الصيفي على أو عن اعتمادًا على الوقت الذي يتم فيه تشغيل الاستعلام - ولكن getdate() يأخذها في الاعتبار، لذلك يتعين عليك حساب الإزاحة ديناميكيًا في كل مرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top