PostgreSQL Geçici Veri Türleri Timestamp ve Interval

Selamlar. Bu yazı PostgreSQL Geçici Veri Türleri için devam niteliğinde olacak. Açıkcası bir önceki yazı hem uzamış durumda olduğundan hem de o gün çok yorgun olduğum için zamansız bir şekilde kesilmişti. Bu yazı ile kalan diğer türleri de anlatayım.

PostgreSQL Geçici Veri Türleri

Timestamp Veri Türü

Arkadaşlar bu veri türünün yaptığı iş diğer veri tabanlarında da yapılmaktadır. Eğer bir kolon Timestamp olarak oluşturulmuşsa tarih ve saat saklayabileceğini bilmeliyiz. Bu türün bir de kardeşi olan Timestamptz adında başka bir şekli bulunmakta. Bu ikinci tür davranış olarak timestamp olmasının yanında time zone da saklayabilmektedir. İkisi arasındaki farkı bu yazıda göreceğiz. Her iki tür 8 byte uzunluğunda. Bu bilgiler ışığında iki yapıya dair bir tablo oluşturalım:

create table tsornek(
    id serial,
    ts timestamp,
    tsz timestamptz
);

Kısacası böyle bir tablomuz var. Bu arada timezone dedik dilersek mevcut timezone hakkında bilgiyi şu query ile elde edebiliriz:

show timezone;

-- Çıktı: Europe/Istanbul

Bu önemli çünkü eklediğimiz veriler bu timezone’a göre şekillenecek. Öncelikle bugünün tarihiyle iki kolonu da doldurup bir ekleme yapalım:

insert into tsornek(ts, tsz) 
values('2017-11-19 20:41:00', '2017-11-19 20:41:00');

Eğer select sorgusu verecek olursak eklediğimiz verilerin aynı şekilde eklenmiş olduğunu göreceğiz. Çünkü timezone şu an içerisinde bulunduğumuz zaman dilimine göre ayarlı. Gelin yeni bir timezone set edelim.

set timezone = 'Europe/Paris';

show timezone;

Şimdi açıkcası bu timezone’u salladım bir şekilde doğru çıktı ki pek şansım yoktur. Ancak artık zaman dilimi parise ayarlı. Yani siz yukarıdakine benzer bir insert sorgusu çalıştırsanız dahi ikinci kolonunuz ayarlı timezone üzerinden çalışacaktır. Örnek bir ekleme yapalım:

insert into tsornek(ts, tsz) 
values('2017-11-19 20:44:00', '2017-11-19 20:44:00');

Eğer bu tabloya select çekecek olsaydık şu çıktıyı alacaktık:

ts tsz
2017-11-19 20:41:00 2017-11-19 20:41:00
2017-11-19 20:44:00 2017-11-19 22:44:00

Gördüğümüz gibi ikinci satırda birinci ve ikinci kolonlar arasında iki saatlik fark bulunmakta. Eğer timezone’u tekrar bulunduğunuz bölgeye ayarlayınca düzelir ya diye düşünüyorsanız da maalesef insert edildiği anda o anki ayara göre zaman belirlendiği için yapacak çok da bir şeyiniz kalmıyor. Sadece update edebilirsiniz.

Bazı Timestamp Fonksiyonları

PostgreSQL Geçici Veri Türleri kapsamında mı sayılır bilmiyorum ama timestamp için bazı fonksiyonlar bulunmakta. Bunlar convert işlemi, gün ve şu an gibi bilgileri içerdiğinden kullanışlılar.

Şu Anki Zaman

Hatırlarsanız CURRENT_TIME gibi bir sabitten bahsetmiştik. Bu da öyle:

select NOW();

Günün Zamanı

Bu fonksiyonumuz günün zamanına dair bilgiyi size döndürme işini yapmakta.

select timeofday();

Timezone Çevirimi

Şu an içerisinde bulunduğumuz zaman dilimi dijital olarak Europe/Istanbul şeklinde dillendiriliyor.  Diyelim ki timezone değişikliğine gitmeden bir timezone verisini başka bir timezone’a çevireceksiniz. Örneğin Europe/Istanbul => Europe/Paris ya da tam tersi. Bu işlemde timezone adında bir fonkiyonu kullanacağız. Kullanımı şöyledir:

select timezone('Europe/Paris', '2017-11-19 22:44:00');

-- ya da sorgu ile örnek

select timezone('Europe/Paris', tsz) from tsornek where id = 2;

Yukarıdaki örnekler paris saatiyle girilen değeri mevcut zaman dilimine çevirecektir. Eğer benim gibi Türkiyede yaşayan bireylerdenseniz bu 2 saatlik o yanlışı düzeltecektir de. Çok uzatırsanız eklenen datanın o an eklendiği zaman diliminin adını alıp ilk argümanı ora ile doldurup tüm saatleri update edebilirsiniz.

Interval Veri Türü

Bu türde zaman periyodlar halinde saklanabilirdir. Yine yabancı olmadığımız bir tür. Açıkcası size en basit haliyle bir zamana ekleme ya da o zamandan çıkarma işlemlerini yapmak istediğinizde yardımcı oluyor. Örneğin SQL üzerinde geçmiş 1 yılın verilerini getir dediğinizde bu yapıyı bir şekilde kullanabilirsiniz. Kısacası kullanımı şöyledir:

select now() - interval '- 2 months ago';

Bir diğer örnek:

select now() - interval '- 10 year 11 months 240 days';

PostgreSQL Geçici Veri Türleri Neler Gördük

Arkadaşlar PostgreSQL Geçici Veri Türleri serisinin sonuna geldik. bu kısımda date, time, timestamp, timestamptz, interval gibi türleri gördük. Dilerseniz bu türler hakkında daha geniş bilgiler elde etmek için resmi dokümanlara bakabilirsiniz.