Timestamp bilgisi için postgresql’de iki farklı veri tipi bulunmaktadır.
- timestamp without time zone
- timestamp with time zone
Her iki veri tipi de time zone bilgisi içermemektedir.
timestamp without time zone
Girdi(input) olarak verilen değerler olduğu gibi kaydedilir ve görüntülenir.
output
timestamp with time zone
Input olarak verilen değerler UTC’ye çevrilip kaydedilir. Bu veri tipi timezone bilgisi tutmaz, sadece “timezone aware”’dir. UTC olarak tutulan veriler gösterilirken database’in timezone bilgisine gore dönüştürülüp gösterilir.
Tam olarak ifade etmek gerekirse postgresql client/server protokolünü implement eden her client, sql sorgusu yaptığında timestamp with time zone veritipinde tanımlanmış alanı database’in timezone bilgisiyle dönüştürülmüş şekilde elde eder.
Bir örnekle ilerleyelim. Database’in timezone bilgisinin ‘UTC’ olduğunu varsayalım. Ya da **set timezone** komutuyla session bazında database’in timezone bilgisini değiştirebiliriz. Konfigürasyon(postgresql.conf) ayarlarından da database’in timezone bilgisi değiştirilebilir.
output
output
Timestamp değerini timezone bilgisiyle verdiğimizde önce UTC’ye çevrilip kaydedilmiştir, ardından database’in timezone bilgisine göre çevrilerek gösterilmiştir.
Daha iyi anlaşılması için database timezone bilgisini ‘EUROPE/ISTANBUL’ olarak değiştirelim.
output
output
Burada dikkat edilmesi gereken nokta timezone bilgisi verilmeden yapılan insert işleminde database’in timezone bilgisi baz alınır. Kısacası database’in timezone bilgisini içeriyormuş gibi işlem yapılır.
AT TIME ZONE
Timestamp veri tipleri arasında dönüşüm yapılmasını sağlar.
Postgresql’deki timezone(zone, timestamp) function’inin sql-friendly olarak yazılmasıdır.
Girilen veri tipine göre iki farklı şekilde yorumlanmaktadır. Dönüşüm yaparken bu noktaya dikkat edilmesi gerekiyor.
- Dönüşüm yapmak istenen veri tipi timestamp with time zone ise geri dönüş tipimiz(return type) timestamp without time zone olacaktır.
- Dönüşüm yapmak istenen veri tipi timestamp without time zone ise geri dönüş tipimiz(return type) timestamp with time zone olacaktır.
Daha iyi anlaşılabilmesi için iki farklı başlık altında ilerleyelim.
AT TIME ZONE ON TIMESTAMP WITHOUT TIME ZONE
Bildiğimiz gibi timestamp without time zone veri tipi timezone awaredeğildir. Girdiğimiz timestamp bilgisinde herhangi bir dönüşüm işlemi gerçekleştirmez, olduğu gibi kaydeder. at time zone key’i ile timestamp verisinin hangi timezone’da olduğunu söylemiş oluruz. Böylece postgresql o veriyi o time zone’da kabul edip database’in timezone bilgisine convert edip timestamp with time zone olarak elde edilmesini sağlar.
Olduğu gibi kaydedilen timestamp(without timezone) verilerinin time zone bilgisi içerecek sekilde gösterilmesini sağlar. Conversion işlemlerinde ve Select sorgularındaki gösterimlerde kolaylık sağlanır.
output
output
AT TIME ZONE ON TIMESTAMP WITH TIME ZONE
at time zone key’i burada daha farklı yorumlanmaktadır. UTC olarak saklanan veriler database’in time zone bilgisi kullanılarak convert edilip gösterilirdi. Burada belirlediğimiz time zone bilgisine göre conversion işlemi gerçekleştirilip timestamp verisi timestamp without time zone tipinde gösterilir.
UTC olarak kaydedilen timestamp verilerin belirlenen bir time zone’daki local time olarak gösterilmesini sağlar. Conversion islemlerinde ve Select sorgularındaki gösterimlerde kolaylık sağlanır.
output
output