2013-04-26 29 views
5

Tôi muốn xác định xem thời gian tiết kiệm ánh sáng ban ngày có đang hoạt động hay không, nhưng ở một khu vực khác với vị trí máy chủ của tôi.Xác định tiết kiệm ánh sáng ban ngày từ xa trong máy chủ sql

Vấn đề của tôi là tôi muốn kiểm tra tiết kiệm ánh sáng ban ngày của London và máy chủ của tôi ở Canada; có thể tìm thấy tiết kiệm ánh sáng ban ngày của múi giờ khác không?

+1

tham khảo trùng lặp (không trả lời): http://stackoverflow.com/questions/6781121/determine-if-daylight-saving-time-is- active-sql-server. Windows xử lý DST bằng cách sử dụng "bảng tra cứu" được lưu trữ trong sổ đăng ký mà thường không thể truy cập được từ T-SQL. – RichardTheKiwi

+0

@RichardTheKiwi - Dữ liệu này từ sổ đăng ký là cơ sở dữ liệu múi giờ của Microsoft [Xem tại đây] (http://stackoverflow.com/tags/timezone/info) và có thể truy cập thông qua lớp .Net 'TimeZoneInfo', có thể được sử dụng trong SQL Server thông qua các cuộc gọi CLR SQL. Tôi sẽ gửi một câu trả lời ngay với một mẫu mã. –

+0

@RichardTheKiwi - Tôi đoán điều này không dễ như tôi nghĩ. Đây là nguồn dữ liệu chính xác, nhưng có một số vấn đề. Xem http: // stackoverflow.com/q/614600/634824 –

Trả lời

5

Bạn cần triển khai bảng DST và tra cứu thời gian DST cho khu vực bạn muốn. DST được xuất bản bởi các tổ chức khác nhau và được làm mới định kỳ. Những gì bạn cần hiểu là DST không thể được xác định bởi một thuật toán, nó chỉ có thể được tìm kiếm như được thiết lập bởi các cơ quan lập pháp khác nhau cho các khu vực khác nhau, và thay đổi thường xuyên. Ví dụ ở đây là current 2013 DST table. Việc duy trì bảng tra cứu DST của ứng dụng hiện tại sẽ là một nhiệm vụ định kỳ cho ứng dụng của bạn.

+0

Việc triển khai bảng dữ liệu múi giờ trong cơ sở dữ liệu của bạn thường không phải là một ý tưởng hay. Nó sẽ kết thúc là một tạo phẩm mà bạn phải duy trì bằng tay, và theo thời gian bạn sẽ thấy nó là không chính xác. –

+3

Tôi đứng theo đề xuất của tôi –

+0

@RemusRusanu Bạn có biết chúng tôi có thể lấy tập lệnh SQL DST cho một năm cụ thể như năm 2015 không? – sqluser

0

Điều tốt nhất cần làm là sử dụng một trong số the two common Time Zone databases.

Tuy nhiên, có vẻ như (theo this question) rất khó để sử dụng cơ sở dữ liệu TimeZone của Microsoft từ SQL Server vì lớp TimeZoneInfo được đánh dấu bằng thuộc tính [HostProtection] với MayLeakOnAbort đặt đúng.

Tôi tin rằng một giải pháp có thể là sử dụng các lớp NodaTime thay thế. Chúng có thể truy cập được từ SQL CLR và cung cấp quyền truy cập vào cả cơ sở dữ liệu.

Tôi sẽ dùng thử và cập nhật tại đây khi hoàn tất.

CẬP NHẬT

Sau khi chiến đấu với những hạn chế an ninh của SQL CLR, tôi đã kết luận rằng đây là cách tiếp cận hiện không thể một trong hai.

Đề xuất hiện tại của tôi là chuyển đổi múi giờ bên ngoài cơ sở dữ liệu, trong logic ứng dụng của bạn.

0

Dưới đây là một IsDST thô cho SQL Server ...

CAST((DATEPART(month, DATEADD(week, -1, <DateTime>)) + 2) % 13/5 AS bit) AS IsDST

Sản lượng 0 Standard Time 8 Tháng Mười Một - 7 tháng 3, và 1 cho ánh sáng ban ngày Thời gian 8 tháng 3 - Tháng 7.

+4

Điều này có thể hoạt động (năm nay?) Cho Canada, nhưng DST bắt đầu vào ngày 29 tháng 3 năm 2015 tại Luân Đôn. – Paolo

-1

trên SQL Server 2016:

Với sys.time_zone_info bây giờ bạn có thể truy vấn nếu múi giờ cụ thể hiện có trên DST.

select * from sys.time_zone_info 

Ở đây bạn có một kết quả ví dụ

name     current_utc_offset is_currently_dst 
Aleutian Standard Time -09:00    1 
Hawaiian Standard Time -10:00    0 
Marquesas Standard Time -09:30    0 
Alaskan Standard Time -08:00    1 
+1

Tôi không chắc tại sao điều này lại bị bỏ phiếu. OP không yêu cầu một cách để biết DST trong một thời gian tùy ý - điều này không thể cung cấp. Có lẽ nguồn dữ liệu không đáng tin cậy ???? Nó sẽ được tốt đẹp để biết. Trên khuôn mặt của nó giải pháp trông khả thi. – bielawski

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