I don't know MySQL syntax by heart, but is this on the right track?
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;
NOTE: Storing a utc_offset like this is sloppy, at best, as the utc_offset changes twice a year in many parts of the world. It is usually much better practice to store a timezone name, and use an actual timezone manipulation library to do your date calculations for you.
EDIT
My suggestion for timezone handling would be to modify your state table as follows:
state
id int
name text
tz varchar
Then update your query as follows:
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;