24 Ocak 2023 Salı

Sütun Tipleri - TIMESTAMP ve time_zone İlişkisi

Giriş
Eğer düz SQL kullanıyorsak TIMESTAMP sütunu time_zone değişkeninden etkilenir. Veri tabanının saat diliminden etkilendiğini görmek için şöyle yaparız.
mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+
2. Varsayılan Değer
Bence kullanım şekli şöyle olmalı
-- Kullanmayın
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP

-- Kullanın
ts TIMESTAMP DEFAULT (UTC_TIMESTAMP)
2.1 CURRENT_TIMESTAMP
Varsayılan değer olarak CURRENT_TIMESTAMP() Kullanıyorsak - time_zone'dan etkilenir.
Örnek
Şöyle yaparızCURRENT_TIMESTAMP ile NOW() aynı şeyler
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Şöyle yaparız. Şu anda bağlantımın time_zone ayarı UTC olduğu için bilgisayarımın saati 10:59 olmasına rağmen, 07:59 olarak kaydediyor.
INSERT INTO t1() VALUES();

SELECT * FROM t1;
+---------------------+---------------------+
| ts                  | dt                  |
+---------------------+---------------------+
| 2021-11-26 07:59:12 | 2021-11-26 07:59:12 |
+---------------------+---------------------+
1 row in set (0.00 sec)
 time_zone değerini değiştirelim
SET @@session.time_zone = '+03:00';
Bu sefer farklı sonuç alırız.
INSERT INTO t1() VALUES();
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM t1;
+---------------------+---------------------+
| ts                  | dt                  |
+---------------------+---------------------+
| 2021-11-26 10:59:12 | 2021-11-26 10:59:12 |
+---------------------+---------------------+
1 row in set (0.00 sec)
2.2 UTC_TIMESTAMP
Dolayısıyla bağlantının time_zone ayarı değişikliğinden etkilenmemek için UTC_TIMESTAMP() kullanılır. Ancak bazı eksikler var. Şöyle yapamıyorum, MySQL hata veriyor
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT (UTC_TIMESTAMP) ON UPDATE (UTC_TIMESTAMP),
  dt DATETIME DEFAULT (UTC_TIMESTAMP) ON UPDATE (UTC_TIMESTAMP)
);
Ancak şöyle yapabiliyorum. Bu durumda ON UPDATE özelliği olmuyor. Bununla ilgili bir hata açılmış.
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT (UTC_TIMESTAMP),
  dt DATETIME DEFAULT (UTC_TIMESTAMP)
);
Precision için şöyle yaparız
CREATE TABLE t1 (
  ts TIMESTAMP(6) DEFAULT (UTC_TIMESTAMP),
  dt DATETIME(6) DEFAULT (UTC_TIMESTAMP)
);
Bu sefer çıktı farklıdır
mysql> INSERT INTO t1() VALUES();
Query OK, 1 row affected (0.03 sec)

mysql> SELECT * FROM t1;
+----------------------------+----------------------------+
| ts                         | dt                         |
+----------------------------+----------------------------+
| 2021-11-26 08:17:46.000000 | 2021-11-26 08:17:46.000000 |
+----------------------------+----------------------------+
1 row in set (0.00 sec)

Hiç yorum yok:

Yorum Gönder

CREATE EVENT - Scheduled Task İçindir

Örnek Şöyle yaparız CREATE EVENT myevent     ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR     DO       UPDATE myschema.mytable SET myc...