0

異なるタイム ゾーンでの実行のサポートが制限されているアプリケーションがあります。基本的に、アプリケーションには西コスト用に 1 つのデータベース/環境があり、東コスト用に 1 つのデータベース/環境があります。

アプリケーションは、getdate() を使用して現在の時刻を計算します。

ソース コードがないため、getdate をカスタム関数に置き換えることはできません。Getdate 関数をオーバーライドする方法はありますか? または、データベースごとに異なるタイム ゾーンを構成することはできますか? 異なるインスタンスはどうですか?

4

1 に答える 1

4

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 に対応していないため、シナリオにとって価値があるかどうかはわかりません。

于 2013-01-30T00:05:30.173 に答える