Alright so this is a little embarrassing, but it really shouldn’t be the solution. The server running MySQL and Grafana was set to PST time zone. Changing the system timezone to UTC solved all of the issues.
That being said - I don’t know why this is the case. It was functioning correctly when the server was set to PST time, and then it wasn’t. MySQL datetime is agnostic in terms of timezone, so whatever Grafana is receiving does not have time zone data applied to it. Grafana must be applying the system timezone to the data AFTER it retrieves it from the database, which I believe should not be the behavior and could even be classified as a bug. Grafana should interpret the data from the database as-is, and in my case it was UTC from the database.
Next time I’m using a time-series database, lol