25 Temmuz 2019 Perşembe

Date/Time Sütun Tipleri - TIMESTAMP WITHOUT TIME ZONE - Kullanmamak Lazım Çünkü Moment Değildir

Giriş
Kullanmayın diyorum çünkü Java'daki LocalDateTime gibidir.

Not : DATE sütun tipine de bakabilirsiniz.
Not : Verilen bir integer değerini time zone ile formatlamak için TO_TIMESTAMP metodu yazısına bakılabilir.

Açıklaması şöyle. Yani WITHOUT TIME ZONE kısmı yazılmayabilir.
The SQL standard requires that writing just timestamp be equivalent to timestamp without time zone, and PostgreSQL honors that behavior.
Bu alan zaman çizgisinden bağımsız bir tarih ve saati saklamak için kullanılır. Açıklaması şöyle.
This type does not represent a moment. It represents a vague idea of potential moments along a range of about 26-27 hours (the range of time zones around the globe).
Verilen bir örnek şöyle.
The WITHOUT only makes sense when you have the vague idea of a date-time rather than a fixed point on the timeline. For example, "Christmas this year starts at 2016-12-25T00:00:00" would be stored in the WITHOUT as it applies to any time zone, not yet having been applied to any one single time zone to get an actual moment on the timeline. 
Verilen bir başka örnek şöyle.
 All our factories around the world take lunch at 12:30 PM". That would be LocalTime, and for a particular date, LocalDateTime. But that has no real meaning, not an actual point on the timeline, until you apply a time zone to get a ZonedDateTime. That lunch break will be at different points on the timeline in the Delhi factory than the Düsseldorf factory and different again at the Detroit factory.
Örnek
Şöyle yaparız.
CREATE TABLE reference_values
(
  created_on timestamp without time zone,
  ...
)
Örnek
Şöyle yaparız
create table attendance (
    id int,
    employee_id int,
    activity_type int,
    created_at timestamp
);

INSERT INTO attendance VALUES
(1, 1, 1,'2020-11-18 7:10:25'),
(2, 2, 1,'2020-11-18 7:30:25'),
(3, 3, 1,'2020-11-18 7:50:25'),
(4, 2, 2,'2020-11-18 19:10:25'),
(5, 3, 2,'2020-11-18 19:22:38'),
(6, 1, 2,'2020-11-18 20:01:05'),
(7, 1, 1,'2020-11-19 7:11:23');
Java 8 Kullanımı
java.time.LocalDateTime ile bu sütun tipi kullanılabilir. Açıklaması şöyle.
The equivalent of Postgres’ TIMESTAMP WITHOUT TIME ZONE in java.time is java.time.LocalDateTime.
Örnek 
Şöyle yaparız.
@Column(name = "local_date_time", columnDefinition = "TIMESTAMP")
private LocalDateTime localDateTime;
Örnek
Elimizde şöyle bir Java kodu olsun
@Entity
@Table(name = "date_tb")
public class Data implements Serializable {
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;

  @Column(name = "date_str")
  private String dateStr;

  @Column(name = "date")
  private Date date;

  @Column(name = "local_time")
  private LocalTime localTime;

  @Column(name = "local_Date")
  private LocalDate localDate;

  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
  @Column(name = "local_datetime_dt")
  private LocalDateTime localDateTimeDt;

  @Column(name = "local_datetime_ts")
  private LocalDateTime localDateTimeTs;

  @Column(name = "offset_datetime")
  private OffsetDateTime offsetDateTime;

  @Column(name = "zoned_datetime")
  private ZonedDateTime zonedDateTime;
}
Şu SQL üretilir. LocalDateTime için TIMESTAMP WITHOUT TIME ZONE üretilmesi normal, ancak OffsetDateTime ve ZonedDateTime için niye TIMESTAMP WITH TIME ZONE üretilmiyor bilmiyorum
#Mapping to this PostgreSQL 
CREATE TABLE IF NOT EXISTS date_tb (
  "id" SERIAL,
  "date_str" VARCHAR(500) NULL,
  "date" TIMESTAMP NULL,
  "local_time" TIMESTAMP NULL,
  "local_date"  DATE NULL,
  "local_datetime_dt" TIMESTAMP NULL,
  "local_datetime_ts" TIMESTAMP NULL,
  "offset_datetime" TIMESTAMP NULL,
  "zoned_datetime" TIMESTAMP NULL,

   PRIMARY KEY ("id")
)
Java 7 Kullanımı
Hibernate/JPA veritabanını oluştururken java.sql.Timestamp tipindeki alanı Postgre'de TIMESTAMP tipine çevrilir. Ancak bence bu doğru değil. Açıklaması şöyle.
For example: Your local time zone is GMT+2. You store "2012-12-25 10:00:00 UTC". The actual value stored in the database is "2012-12-25 12:00:00".

Hiç yorum yok:

Yorum Gönder