You fell victim to a cascade of bad ideas.
Do not use locale-dependent format in your statements if you can avoid it. If locale settings change (
DateStyle in particular), your statement suddenly does something different.
'03/11/2018' is ambiguous unless coupled with your specific settings. Always use ISO format which is unambiguous and does not depend on additional settings:
Do not assign a
timestamp value (or literal) to a
timestamptz column. The assignment cast depends on the current
timezone setting of your session which introduces another dependency. With a different timezone setting your statement does something different. Use an explicit cast or a
timestamp with time zone literal (
timestamptz). In your case:
SET interval_start_timestamp = '2018-03-11 02:00:00'::timestamp AT TIME ZONE 'America/Denver'
WHERE id = 2395
Using an actual time zone name (not an abbreviation) accounts for DST reliably - if your OS is up to date as Postgres works with information provided by the underlying OS.
Which results in
'2018-03-11 03:00:00'. As ypercube pointed out, you hit the start of Summer Time a.k.a. Daylight Savings Time. Clocks were turned forward 1 hour at this time. Each time between 02:00:00 and 02:59:59.999999 is interpreted to mean something between 03:00:00 or 03:59:59.999999 respectively, by the silly rules of DST.
The mere existence of "daylight saving time" (DST) is an insult to reason. It should be abolished and never be spoken of again (except for historic time values doomed to mess with this forever).
SELECT '2018-03-11 02:34:00'::timestamp AT TIME ZONE 'America/Denver' AT TIME ZONE 'America/Denver' AS t2
, '2018-03-11 03:34:00'::timestamp AT TIME ZONE 'America/Denver' AT TIME ZONE 'America/Denver' AS t3;
t2 | t3
:------------------ | :------------------
2018-03-11 03:34:00 | 2018-03-11 03:34:00