2

次の表と関連する列があります。

state
    id int
    name text
    utc_offset int (minutes)

sale
    id int
    state_id int
    created datetime
    amount decimal(8,2)

列に入力される値createdは、状態id=1のローカルサーバー時間です。

各州の1日の総売上高を取得するにはどうすればよいですか?

タイムゾーンデータを処理するためのより良い方法はありますか?

4

2 に答える 2

2

ソリューションは、複数のタイムゾーンを持つ州では機能しません。

一般に、ベストプラクティスは、すべての日時をUTCとしてデータベースに保存することです。次に、クライアントのタイムゾーン(通常はWebアプリですぐに利用可能)を使用して、ユーザーが独自のローカルタイムゾーンで表示できるようにフォーマットします。

したがって、州の時間オフセットを保存することはなく、州のクエリによる1日あたりの売上ははるかに簡単になります。

于 2013-01-02T12:59:30.460 に答える
2

MySQLの構文はよくわかりませんが、これは正しい方向に進んでいますか?

SELECT sale.name AS name, 
    adddate(sale.created. interval (state.utc_offset - (select utc_offset from state where id = 1)) minute) AS date, 
    SUM(amount) AS total_amount
FROM sale
JOIN state ON sale.state_id = state.id
GROUP BY name,date;

注:このようなutc_offsetの保存は、世界の多くの地域でutc_offsetが年に2回変更されるため、せいぜいずさんです。通常は、タイムゾーン名を保存し、実際のタイムゾーン操作ライブラリを使用して日付の計算を行うことをお勧めします。

編集

タイムゾーン処理に関する私の提案は、状態テーブルを次のように変更することです。

state
    id int
    name text
    tz varchar

次に、クエリを次のように更新します。

SELECT sale.name AS name,
    CAST(CONVERT_TZ(sale.created,'utc',state.tz) AS DATE) AS date,
    SUM(amount) AS total_amount
FROM sale
JOIN state ON sale.state_id = state.id
GROUP BY name,date;
于 2013-01-02T12:37:47.137 に答える