Postgreslerde, ve olarak timestamp with time zone
kısaltılabilir . Basitlik için kısa tip isimleri kullanacağımtimestamptz
timestamp without time zone
timestamp
Unix zaman damgasını bir postgres'den almak , dediğiniz timestamptz
gibi now()
, basittir:
select extract(epoch from now());
Gerçekten timestamptz
de dahil olmak üzere herhangi bir türden mutlak zaman alma hakkında bilmeniz gereken her şey now()
.
Sadece timestamp
tarla varken işler karmaşıklaşıyor .
Bu alana timestamptz
benzer verileri koyduğunuzda now()
, önce belirli bir saat dilimine dönüştürülecek (açık bir şekilde at time zone
veya oturum saat dilimine dönüştürülerek) ve saat dilimi bilgileri atılacaktır . Artık mutlak bir zaman değil. Bu nedenle genellikle zaman damgalarını timestamp
normalde kullanacağınız gibi saklamak istemezsiniz timestamptz
- belki de her saat 6: 00'da belirli bir tarihte bir film yayınlanır , işte böyle bir kullanım durumudur.
Sadece tek bir saat diliminde çalışırsanız, (mis) ile kurtulabilirsiniz timestamp
. Geri dönüş timestamptz
, DST ile başa çıkmak için yeterince zekidir ve zaman damgalarının, dönüşüm amaçları için geçerli zaman diliminde olduğu varsayılır. İşte GMT / BST için bir örnek:
select '2011-03-27 00:59:00.0+00'::timestamptz::timestamp::timestamptz
, '2011-03-27 01:00:00.0+00'::timestamptz::timestamp::timestamptz;
/*
|timestamptz |timestamptz |
|:---------------------|:---------------------|
|2011-03-27 00:59:00+00|2011-03-27 02:00:00+01|
*/
DBFiddle
Ancak, aşağıdaki kafa karıştırıcı davranışa dikkat edin:
set timezone to 0;
values(1, '1970-01-01 00:00:00+00'::timestamp::timestamptz)
, (2, '1970-01-01 00:00:00+02'::timestamp::timestamptz);
/*
|column1|column2 |
|------:|:---------------------|
| 1|1970-01-01 00:00:00+00|
| 2|1970-01-01 00:00:00+00|
*/
DBFiddle
Bunun nedeni :
PostgreSQL, türünü belirlemeden önce değişmez bir dizgenin içeriğini asla incelemez ve bu nedenle her ikisine de […] zaman dilimi olmadan zaman damgası olarak davranır. Bir değişmezin zaman dilimi ile zaman damgası olarak değerlendirildiğinden emin olmak için doğru açık türü belirtin… Zaman dilimi olmadan zaman damgası olduğu belirlenen bir değişmezde, PostgreSQL herhangi bir zaman dilimi göstergesini sessizce yoksayır