2


0

私たちは二つの別々の場所に二つのデータベースを持っています。 データベースの1つは、ユーザーとは別のタイムゾーンにあります。

問題は、別のタイムゾーンにあるデータベースがDate値で更新されると、データベースは渡されたDateから1:00時間を自動的に減算することです。

問題は、NULL日付(12:00:00)を渡すと、DAY値が前日に変更されることです。

更新はストアドプロシージャを介して行われ、フロントエンドはVB.NETスマートクライアントです。

これをどのように適切に処理しますか。 私は基本的にTIMEを保存することすらしたくありませんが、その方法を理解することはできません。

3 Answer


2


データベースに何の日時が必要なのか、またはアプリケーションが何を渡しているのか明確ではありません。

ユーザーのPCから、火曜日の午前12時30分であり、Dbサーバーの時計から月曜日の午後11時30分と言われているとします。

'current date’に値(たとえばTRUNC(SYSDATE))を挿入した場合、データベースに関する限り、月曜日です。 現在の時刻に値を挿入した場合(例:SYSDATE)、それも月曜日です。 セッションの現在時刻(CURRENT_TIMESTAMP)とタイムゾーンの値を挿入してデータベースに保存するように依頼すると、午後11時30分に保存されます。 データベースに日付「2009-12-31 14:00:00」を保存するように依頼すると、それが保存されます。 あなたがそれに日時/時間帯 '2009-12-31 14:00:00 08:00’を保存するように頼むならば、あなたは上級マニュアルにいます。 データベースに タイムゾーンデータを使用してタイムスタンプを格納するように依頼できます。 夏時間も考慮してください。


1


テーブルを更新するストアドプロシージャメソッドで TRUNC関数を使用して調査します。 メソッド(テーブルを更新する)のデータ型がDATE型ではない場合は、 to_dateを使用してください。 ] TRUNC機能と組み合わせて機能します。


1


これは質問の範囲外ですが、ユーザーが異なるタイムゾーンからデータベースにアクセスしている場合はすべて、サーバーとデータベースのクロックタイムゾーンをUTCに設定する必要があります。 おそらく遅すぎるかもしれませんが、データベースサーバーをUTCに設定すると、夏時間やさまざまなタイムゾーンによって引き起こされる問題が解消されます。

私の考えでは、日付/時刻データは常にUTCに格納できます。 このデータは、ユーザーに提示された時点で現地時間に変換できます。 Oracleでは、実際にはTIMESTAMP with TIME ZONEデータ型を使用してこれを容易にしています。 これにより、UTC(SYS_EXTRACT_UTC)または現地時間(データベースサーバに対してローカル)としてデータにアクセスすることができます。

それは世界のすべての場所で同じ日になることはありませんので、日付は時間なしで考慮することはできません。

もちろん、私の意見の中の別のものは夏時間を排除するべきだということです。 しかしそれは別の話題です。