<div dir="ltr"><div><div>Julien,<br></div><div><br>Are you thinking that PG will allow you to have different timezones in your timestamp? If my understanding of PG is correct, it keeps everything in a single timezone - UTC. Then everything else is set using the offset. See, e.g. <a href="http://www.postgresql.org/docs/9.1/static/datatype-datetime.html">http://www.postgresql.org/docs/9.1/static/datatype-datetime.html</a><br>
<p>"For <tt class="">timestamp with time zone</tt>, the
      internally stored value is always in UTC (Universal
      Coordinated Time, traditionally known as Greenwich Mean Time,
      <acronym class="">GMT</acronym>). An input value that
      has an explicit time zone specified is converted to UTC using
      the appropriate offset for that time zone. If no time zone is
      stated in the input string, then it is assumed to be in the
      time zone indicated by the system's <a href="http://www.postgresql.org/docs/9.1/static/runtime-config-client.html#GUC-TIMEZONE">timezone</a>
      parameter, and is converted to UTC using the offset for the
      <tt class="">timezone</tt> zone.</p>

      When a <tt class="">timestamp with time zone</tt>
      value is output, it is always converted from UTC to the
      current <tt class="">timezone</tt> zone, and displayed
      as local time in that zone. To see the time in another time
      zone, either change <tt class="">timezone</tt> or use
      the <tt class="">AT TIME ZONE</tt> construct."<br><br>So, looking at a server that is set for PDT, for table test with fields name, text and updated_at<br><br>Default with no timezone or offset:<br>(query (:insert-into 'test :set 'name "george" 'text "insert here"  'updated-at <br>
                     (local-time:encode-timestamp 0 0 0 12 01 01 2013)))<br><br></div>2013-01-01 12:00:00-08 (looking at the default timezone for the server, PG has set the timezone to UTC less 8 hours - UTC time would be 04:00:00)<br>
<div><br>Using offset to explicitly offset 1 hour from UTC (e.g. Paris)<br>(query (:insert-into 'test :set 'name "ringo" 'text "offset 1 hour" 'updated-at <br>                     (local-time:encode-timestamp 0 0 0 12 01 01 2013 :offset 3600)))<br>
<br></div><div>2013-01-01 03:00:00-08 (looking at the default timezone for the server, PG has kept the timezone as PDT - UTC less 8 hours - but set the time as 03:00:00, which is 1 hour ahead of UTC)<br></div><div><br>Using timezone to explicitly set it for UTC<br>
(query (:insert-into 'test<br>                     :set 'name "paul" 'text "insert here using timezone utc"<br>                     'updated-at<br>                     (local-time:encode-timestamp 0 0 0 12 01 01 2013<br>
                                                  :timezone local-time::+utc-zone+)))<br><br></div><div>2013-01-01 04:00:00-08 (looking at the default timezone for the server, PG has kept the timezone as PDT - UTC less 8 hours - but set the time as 04:00:00, which is the time in UTC relative to the PDT time at the server.<br>
<br></div>Does this help?<br><br></div>Sabra<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jul 24, 2013 at 12:14 AM, Julien Danjou <span dir="ltr"><<a href="mailto:julien@danjou.info" target="_blank">julien@danjou.info</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Wed, Jul 24 2013, Sabra Crolleton wrote:<br>
<br>
> I use the local-time package with encode-timestamp to create the timestamp<br>
> and just put that into the database.<br>
><br>
> Function: local-time:encode-timestamp nsec sec minute hour day month year<br>
> &key timezone offset into<br>
><br>
> Returns a new timestamp instance corresponding to the specified time<br>
> elements. The offset is the number of seconds offset from UTC of the<br>
> locale. If offset is not specified, the offset will be guessed from the<br>
> timezone. If a timestamp is passed as the into argument, its value will be<br>
> set and that timestamp will be returned. Otherwise, a new timestamp is<br>
> created.<br>
<br>
</div>The problem is that it returns a timestamp without any timezone<br>
information, it just convert the time given into an UTC representation<br>
based on the timezone arguments.<br>
Or when INSERTed, if your Postgresql session runs with a default<br>
timezone different than UTC (which is usually the case), PG will insert<br>
it considering the timezine is in the locale timestamp, not UTC.<br>
<br>
When your PG server is in GMT+2 and has such a default session, if:<br>
a. you INSERT (encode-timestamp 0 0 0 12 01 01 2013) it will insert<br>
   2013-01-01 12:00:00+02<br>
   (which is correct because the CL timezone and the PG timezone matches)<br>
<br>
b. you INSERT (encode-timestamp 0 0 0 12 01 01 2013 :timezone UTC) it will insert<br>
   2013-01-01 10:00:00+02<br>
   (which is wrong since the timestamp is in UTC)<br>
<br>
And here I'm on case b.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Julien Danjou<br>
# Free Software hacker # freelance consultant<br>
# <a href="http://julien.danjou.info" target="_blank">http://julien.danjou.info</a><br>
</font></span></blockquote></div><br></div>