問題の簡単な説明 :どういうわけか、current_date、current_time、current_timestampは、ユーザーアカウントの設定に応じて日付時刻を提供する必要があり、モスクワ時間はサーバー自体になります。
システムは無限にスケーラブルで、広大な国のどの地域にも膨大な数の潜在的なユーザーがいると考えられていました。ある時点で、たとえばウラジオストクのユーザーがモスクワ時間のシステムで作業するのが便利かどうかという疑問が生じました。 サーバーはモスクワにあり、モスクワ時間を持ち、各ユーザーは(出身地域に関係なく)複数の(個別の)データベースを持ち、それらはすべて大まかに言って同じサーバー上にあります。 時間帯ごとにサーバーを作成するのは愚かであり、システムコンセプトの観点からは不可能です。ユーザーはいつでも時間帯を変更できるからです。
現在使用されているデータベースのタイプはfirebird 3です
マニュアルを投げて勉強した後、次の簡単な解決策が見つかりました。 3つのシンプルなビューが作成されました。
CREATE OR ALTER VIEW D_CURRENT_DATE(DD) AS SELECT cast((current_timestamp+0.000000000000000)as date) as dd FROM RDB$DATABASE; CREATE OR ALTER VIEW D_CURRENT_TIME(DD) AS SELECT cast((current_timestamp+0.000000000000000)as time) as dd FROM RDB$DATABASE; CREATE OR ALTER VIEW D_CURRENT_TIMESTAMP(DD) AS SELECT (current_timestamp+0.000000000000000) as dd FROM RDB$DATABASE;
上記のVIEW-モスクワ時間(デフォルト)。 ユーザーがモスクワ以外のタイムゾーン、たとえば「UTC + 7クラスノヤルスク時間」を選択すると、phpスクリプト(ユーザーがこれを選択する)は、データベースのVIEWを次のように変更します。
CREATE OR ALTER VIEW D_CURRENT_DATE(DD) AS SELECT cast((current_timestamp+0.166666666666667)as date) as dd FROM RDB$DATABASE; CREATE OR ALTER VIEW D_CURRENT_TIME(DD) AS SELECT cast((current_timestamp+0.166666666666667)as time) as dd FROM RDB$DATABASE; CREATE OR ALTER VIEW D_CURRENT_TIMESTAMP(DD) AS SELECT (current_timestamp+0.166666666666667) as dd FROM RDB$DATABASE;
したがって、ベースのcurrent_timestampから、ユーザーが選択したタイムゾーンに応じて、時間数が加算(または減算)されます。
さらに、すべてのスクリプト、プロシージャ、トリガーのコードでは、current_timestampの代わりにd_current_timestampが常に書き込まれます。 このため、すべてのデータベースがモスクワ時間と同じサーバー上にあるにもかかわらず、モスクワ時間ではなくユーザーの時間がデータベースのすべてのレコードに常に記録されます。