SQL Server は、ホスト オペレーティング システムから直接時間を取得します。タイムゾーンに対応しておらず、1 つのサーバー上で、このデータベースまたはこのインスタンスがこのタイムゾーンにあり、この別のデータベースまたは別のインスタンスがこのタイムゾーンにあると言う方法はありません。他のタイムゾーン。これを達成できる唯一の方法は、完全に異なるサーバーを用意し、日付/時刻同期サービス (仮想マシンの場合はホストからのものを含む) をオフにすることです。
GETUTCDATE()
またはを使用して UTC 時刻を保存する必要がありSYSUTCDATETIME()
ます。そうすれば、データの一部がどのタイムゾーンから来たかを知る必要がなくなり、これらのタイムゾーンのいずれかに (または後でサポートする必要がある他のタイムゾーンに) いつでも簡単に変換できます。たとえば、ASP.NET は非常に広範なタイムゾーンをサポートしています。
INSTEAD OF INSERT
トリガーを使用してソースコードが送信しているものをオーバーライドし、送信先を無視することができますGETDATE()
。簡単な例:
CREATE TRIGGER dbo.whatever
ON dbo.tablename
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.tablename(col1, col2, date_created)
SELECT col1, col2, SYSUTCDATETIME() FROM inserted;
-------------------^^^^^^^^^^^^^^ this overrides what they passed
END
GO
新しいTIMEZONEOFFSET
データ型を検討することもできますが、DST に対応していないため、シナリオにとって価値があるかどうかはわかりません。