Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để sử dụng TimeZoneInfo trong hội SQLCLR trong SQL Server 2012

Câu trả lời được cập nhật

Tôi đã viết tiện ích mà tôi đã nói trong câu trả lời ban đầu, mà bạn có thể tìm thấy ở đây .

Ngoài ra, kể từ SQL Server 2016 (và Cơ sở dữ liệu Azure SQL), bây giờ bạn có thể sử dụng AT TIME ZONE từ khóa để chuyển đổi giữa các múi giờ.

Câu trả lời ban đầu

Rất tiếc, không có giải pháp tuyệt vời nào để làm việc với múi giờ trong SQL Server.

Tôi đã điều tra kỹ vấn đề mà bạn đã liên kết, cùng với vấn đề này cũng. Không có chức năng múi giờ tích hợp và bất kỳ việc sử dụng nào của TimeZoneInfo trong SQLCLR yêu cầu lắp ráp được đăng ký là "không an toàn". Điều này thường không được mong muốn.

Tôi cũng đã điều tra bằng cách sử dụng Noda Time từ SQLCLR. Bạn có thể đọc về nó trong số báo này . Nó cũng phải được đăng ký là "không an toàn" vì cách một số mục nhất định được lưu trữ nội bộ.

Cuối cùng, với một trong hai mục, vấn đề là không có cách nào để lưu vào bộ đệm bất kỳ thứ gì trong SQLCLR. Bạn không thể sử dụng các biến tĩnh theo cách an toàn cho chuỗi và bạn không thể thực hiện bất kỳ đồng bộ hóa chuỗi nào hoặc sử dụng các lớp như ConcurrentDictionary . SQL muốn có toàn quyền kiểm soát mô hình phân luồng của hợp ngữ. Chỉ mã kiểu sử dụng một lần và vứt đi đơn luồng mới hoạt động trong các tập hợp "an toàn". Tôi đã tìm hiểu sâu về vấn đề này trong câu hỏi này: Bộ nhớ đệm đa luồng trong SQL CLR

Hy vọng rằng, sẽ có cuối cùng là một bản dựng của Noda Time sẽ hoạt động trong SQLCLR, nhưng nó sẽ là một bản dựng đặc biệt không thực hiện bất kỳ bộ nhớ đệm nào. Vì vậy, nó sẽ không hoạt động nhanh chóng, nhưng nó sẽ hoàn thành công việc mà vẫn an toàn.

TimeZoneInfo không có khả năng thay đổi. Vì vậy, trừ khi nhóm SQL Server đưa các chức năng múi giờ trực tiếp vào SQL Server đúng cách (như Oracle và Postgres làm), thì bạn chỉ có một số tùy chọn:

  • Đừng cố gắng chuyển đổi múi giờ trong lớp dữ liệu. Làm việc với datetime hoặc datetime2 giá trị theo giờ UTC hoặc sử dụng datetimeoffset giá trị với bất kỳ phần bù nào. Nhưng thực hiện tất cả các chuyển đổi giữa các múi giờ trong lớp ứng dụng. Đây là khuyến nghị tốt nhất của tôi lúc này.

  • Sao chép tất cả dữ liệu cho múi giờ vào các bảng SQL thực và viết các hàm hoạt động với dữ liệu đó. Đây không phải là ý tưởng tốt nhất, vì dữ liệu thay đổi thường xuyên nên việc bảo trì bảng có thể là một thách thức. Ngoài ra, việc nhận được các chức năng chính xác, bao gồm tất cả các quy tắc thay đổi tiết kiệm ánh sáng ban ngày, có thể là một thách thức. Tôi không biết bất kỳ dự án nào có cái này được đóng gói đẹp và gọn gàng, nhưng nếu có ai - vui lòng cho tôi biết trong phần bình luận.

  • Bật xp_regread và làm việc với dữ liệu múi giờ trực tiếp từ các khóa đăng ký windows. Các bản cập nhật sẽ được thực hiện cho bạn, nhưng bạn vẫn gặp phải những thách thức tương tự khi viết các hàm này. Và cho phép đọc sổ đăng ký có thể có nhiều rủi ro bảo mật như việc bật các cụm CLR không an toàn.

Một ý tưởng khác mà tôi đang xem xét là viết IANA / Olson TZDB phân tích cú pháp và các chức năng dành riêng cho SQL Server. Điều này sẽ tương tự như tùy chọn 2 ở trên, nhưng được thực hiện theo cách dễ bảo trì và với dữ liệu tiêu chuẩn IANA thay vì múi giờ của Windows. Có lẽ một ngày nào đó tôi sẽ đạt được điều này, hoặc có thể ai đó sẽ đánh bại tôi. Một lần nữa, tôi không biết về bất kỳ dự án hiện tại nào thực hiện điều này, nhưng nếu ai đó biết về một dự án, vui lòng cho tôi biết trong phần bình luận. ( xong - xem bản cập nhật ở đầu )

Về SWITCHOFFSET - điều đó chỉ hoạt động khi bạn đã biết phần bù mục tiêu. Đó là một nửa trận chiến và có lẽ tại sao Microsoft vẫn đánh dấu datetimeoffset như không phải "nhận biết tiết kiệm ánh sáng ban ngày" trong tài liệu .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CURRENT_TIMESTAMP Ví dụ trong SQL Server (T-SQL)

  2. Azure Data Studio là gì?

  3. SQL Server:Chỉ mục nhập cuối cùng trong GROUP BY

  4. Chỉnh sửa hàng / bản ghi bảng trong SQL Server Management Studio (SSMS) - Hướng dẫn sử dụng SQL Server / TSQL Phần 18

  5. Việc gán các tham số đầu vào thủ tục được lưu trữ cho các biến cục bộ có giúp tối ưu hóa truy vấn không?