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;