Cách tốt nhất để lấy tên khóa múi giờ từ SQL Server


8

Dưới đây là những gì tôi chắp nối nhưng tôi muốn xem những cách khác có sẵn.

SET NOCOUNT ON;
GO
DECLARE @tz VARCHAR(50)
EXEC [master].[dbo].[xp_regread]
    'HKEY_LOCAL_MACHINE'
    ,'SYSTEM\CurrentControlSet\Control\TimeZoneInformation'
    ,'TimeZoneKeyName'
    ,@tz OUT;

SELECT 
    GETDATE()
    ,'(' + LEFT(PARSENAME(REPLACE(@tz, ' ','.'),3),1) 
    + '' + LEFT(PARSENAME(REPLACE(@tz, ' ','.'),2),1) 
    + '' + LEFT(PARSENAME(REPLACE(@tz, ' ','.'),1),1) +')'

Đầu ra: 2014-10-14 16: 22: 21.037 (CST)


Mục tiêu của bạn là lấy múi giờ của máy chủ?
Erik

Câu trả lời:


4

Đọc khóa reg bằng cái này hoặc SQLCLR là cách chính xác duy nhất mà tôi biết (cá nhân tôi sẽ tạo một công việc cập nhật bảng thay vì bật xp_regread.).

Kịch bản powershell này là một ví dụ về cách cập nhật bảng cấu hình với thông tin này.

$timeZone = (get-itemproperty 'HKLM:\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\').TimeZoneKeyName

$Connection = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString = "server=.;database=myDatabase;trusted_connection=true;"
$Connection.Open()
$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $Connection
$Command.CommandText = "
        MERGE ConfigTable AS target
        USING (SELECT 'TimeZone', @timeZone) AS source (ConfigKey, ConfigValue)
        ON (target.ConfigKey = source.ConfigKey)
        WHEN MATCHED THEN UPDATE SET ConfigValue = source.ConfigValue
        WHEN NOT MATCHED THEN INSERT (ConfigKey, ConfigValue) VALUES (source.ConfigKey, source.ConfigValue)" 
$command.Parameters.AddWithValue("@timeZone", $timeZone)
$Command.ExecuteNonQuery()
$Connection.Close()

Tất cả các hệ thống khác có bù vv đều cho kết quả không chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.