<blockquote>
<blockquote>
<p>It's not as clean a solution as altering the db schema (because it requires<br>
the client to modify its sql queries and it requires the client code to know<br>
what timezone the server's timestamps actualy are in), but it avoid the<br>
lenghty "alter table".<br>
The server's timestamps are actually in UTC. Therefore it seems the cleanest solution is fixing the bugs in the client where they are assuming, incorrectly, that they're in local time.</p>
</blockquote>
</blockquote>

<p>The 'with timezone' variant is the idiomatic way to fix timezone issues. It was created for this purpose and is supported all the way down to the wirelevel protocol. You can fix timezone issues another way, but that's IMHO just a hack.</p>

<p>The 'without timezone' variants aren't lighter than the 'with' ones; they exist mainly for sql compliance / backward compatibility and there's no good reason to use them nowadays.</p>

<blockquote>
<div class="highlight"><pre>    <span class="n">tokill</span><span class="o">=#</span> <span class="k">show</span> <span class="n">time</span> <span class="k">zone</span><span class="p">;</span>
     <span class="n">Europe</span><span class="o">/</span><span class="n">Paris</span>
    <span class="n">tokill</span><span class="o">=#</span> <span class="err">\</span><span class="n">d</span> <span class="n">foo</span>
     <span class="n">d_notz</span> <span class="o">|</span> <span class="k">timestamp</span> <span class="k">without</span> <span class="n">time</span> <span class="k">zone</span> <span class="o">|</span> 
     <span class="n">d_tz</span>   <span class="o">|</span> <span class="k">timestamp</span> <span class="k">with</span> <span class="n">time</span> <span class="k">zone</span>    <span class="o">|</span> 
    <span class="n">tokill</span><span class="o">=#</span> <span class="k">insert</span> <span class="k">into</span> <span class="n">foo</span> <span class="k">values</span> <span class="p">(</span><span class="s1">'2013/01/01 00:00:00'</span><span class="p">,</span> <span class="s1">'2013/01/01 00:00:00'</span><span class="p">),(</span><span class="s1">'2013/01/01 00:00:00'</span><span class="p">,</span> <span class="s1">'2013/01/01 00:00:00'</span> <span class="k">at</span> <span class="n">time</span> <span class="k">zone</span> <span class="s1">'utc'</span><span class="p">);</span>
    <span class="k">INSERT</span> <span class="mi">0</span> <span class="mi">2</span>
    <span class="n">tokill</span><span class="o">=#</span> <span class="k">select</span> <span class="n">d_notz</span><span class="p">,</span> <span class="n">d_notz</span> <span class="k">at</span> <span class="n">time</span> <span class="k">zone</span> <span class="s1">'utc'</span><span class="p">,</span> <span class="n">d_tz</span> <span class="k">from</span> <span class="n">foo</span><span class="p">;</span>
     <span class="mi">2013</span><span class="o">-</span><span class="mi">01</span><span class="o">-</span><span class="mi">01</span> <span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span> <span class="o">|</span> <span class="mi">2013</span><span class="o">-</span><span class="mi">01</span><span class="o">-</span><span class="mi">01</span> <span class="mi">01</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="o">+</span><span class="mi">01</span> <span class="o">|</span> <span class="mi">2013</span><span class="o">-</span><span class="mi">01</span><span class="o">-</span><span class="mi">01</span> <span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="o">+</span><span class="mi">01</span>
     <span class="mi">2013</span><span class="o">-</span><span class="mi">01</span><span class="o">-</span><span class="mi">01</span> <span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span> <span class="o">|</span> <span class="mi">2013</span><span class="o">-</span><span class="mi">01</span><span class="o">-</span><span class="mi">01</span> <span class="mi">01</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="o">+</span><span class="mi">01</span> <span class="o">|</span> <span class="mi">2012</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mi">23</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="o">+</span><span class="mi">01</span>
</pre></div>

<p>This looks to me like the d_notz column is exactly what we want: Put the data in and take it out without the server messing with it. We just have to stop the client messing with it also.</p>
</blockquote>

<p>You're hoping to outsmart the postgres devs, it's rarely a good bet :p You can either fix the timezone issue once server-side following best-practice, or multiple times (once per client) using one of the solutions above.</p>

<p>That being said, if the "alter table" downtime is unacceptable to the sysadmins, then that theoretical discussion is moot, and the practical decision to fix things client-side wins.</p>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br>Reply to this email directly or <a href='https://github.com/openstreetmap/openstreetmap-website/issues/375#issuecomment-21482548'>view it on GitHub</a>.<img src='https://github.com/notifications/beacon/uTRSc6ihLa7Shf84BpiOpu5p-sEO603Adi0xI76mcGfT_gJWm4GdBKeaxLg8tieb.gif' height='1' width='1'></p>