1

いくつかの作業項目のステータスを取得するデータベースのビューがあります。たとえば、開始日と終了日を取得し、それに基づいていくつかの計算を行い、' ' タイプの回答GetDate()を返します。Work Remaining

問題は、データベース サーバーが米国にあり、私がオーストラリアにいることです。

したがって、現在の時刻は 7 月 20 日の 19 時 33 分でありGetDate()、サーバーでは 20 日の 02 時 33 分が返されます。

タイムゾーンはどのように扱うべきですか? ユーザー プロファイルにタイムゾーン フィールドを含める必要がありますか?クライアント側で時間を差し引いたり追加したりしますか? それに関する問題は、すべてが日付と時刻を操作する必要があることです。つまり、アプリケーションとレポートです。

たとえば、特定の作業の残り時間を返すビューがあります。GETDATE() を使用してこれを計算します。

ALTER VIEW [dbo].[vwSprintSummary] AS
SELECT 
    SprintId, 
    SprintName, 
    MIN(DateValue) AS FirstSprintDate,
    MAX(DateValue) AS LastSprintDate,
    SprintEndDate,
    COUNT(DISTINCT PersonId) AS AssignedPeople, 
    COUNT(DISTINCT ProjectResourceId) AS AssignedRoles, 
    SUM(AssignedProductiveHours * CanBurnDown) AS Capacity,
    SUM(CASE WHEN CAST(GETDATE() AS DATE) <= DateValue THEN AssignedProductiveHours* CanBurnDown ELSE 0 END) AS RemainingCapacity
FROM [vwSprintDailyBreakdown]
GROUP BY SprintName, SprintId, SprintStartDate, SprintEndDate
GO

どういうわけか、正しいタイムゾーンで回答を得ることができるように、GetDate() を 'DATEADD...' に変更する必要がありますか?

この場合、「修正」はに変更するGETDATE()ことですDATEADD(HOUR, 17, GETDATE())

ハードコーディングされていることは知っていますが、本質的には問題を解決します。

どういうわけかサーバーに自分のゾーンを伝え、自分の場所に基づいて日付を返すようにする方法はありませんか?

4

1 に答える 1

4

一般的に言えば、データベース内のすべての情報を UTC で保存し、すべてのビジネス ロジック処理も UTC で実行し、プレゼンテーション ロジック レイヤーでローカル タイムゾーンに変換するだけです。データベース サーバーは、ユーザーのタイムゾーンをまったく意識しないままにすることができます (そうすべきです)。

私自身のプロジェクトでは、データベース サーバーのクロックよりも Web サーバーのクロックを信頼する傾向があるためGETUTCDATE()、SQL Server では決して使用せず、代わりにすべての日付と時刻を SQL パラメータとして に提供します。 " は、独自の「今日」の定義を提供します (つまり、日付/時刻の最小値と最大値を提供することによって)。

于 2013-07-20T10:20:51.397 に答える