4.3 SQL Time Types
SQL มี type สำหรับเวลา 4 แบบ — ใช้ผิดตัว = bug ที่หาไม่เจอจนถึงวันที่เปลี่ยน timezone
4 Types ของเวลาใน SQL
Section titled “4 Types ของเวลาใน SQL”| Type | เก็บอะไร | ตัวอย่าง | ใช้เมื่อ |
|---|---|---|---|
DATE | ปี, เดือน, วัน | 2026-04-24 | วันเกิด, วันที่สมัคร |
TIME | ชั่วโมง, นาที, วินาที | 14:30:00 | เวลาเปิด-ปิดร้าน |
TIMESTAMP | DATE + TIME (ไม่มี timezone) | 2026-04-24 14:30:00 | event ใน timezone เดียว |
TIMESTAMPTZ | DATE + TIME + timezone | 2026-04-24 14:30:00+07 | ทุกอย่างที่เกี่ยวข้องข้ามประเทศ |
Sheets ไม่มี type แยกสำหรับ DATE / TIME / TIMESTAMP — ทุกอย่างเป็น serial number:
=TODAY() → วันที่ (ส่วนจำนวนเต็ม)=NOW() → วันที่ + เวลา (จำนวนเต็ม + ทศนิยม)=NOW() - TODAY() → เวลาเท่านั้น (ส่วนทศนิยม)Sheets ไม่มี timezone — มันใช้ timezone ของ spreadsheet settings (File → Settings → Time zone)
=TEXT(NOW(), "YYYY-MM-DD HH:MM:SS") → format ชัดเจนข้อจำกัดสำคัญ: ถ้า 2 คนเปิด Sheets เดียวกันจาก timezone ต่างกัน — NOW() จะให้ค่า เดียวกัน (timezone ของ spreadsheet) ไม่ใช่ local time ของแต่ละคน
#include <stdio.h>#include <time.h>
int main() { time_t now = time(NULL);
// Local time (timezone ของเครื่อง) struct tm *local = localtime(&now); printf("Local: %d-%02d-%02d %02d:%02d:%02d\n", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec);
// UTC (ไม่มี timezone) struct tm *utc = gmtime(&now); printf("UTC: %d-%02d-%02d %02d:%02d:%02d\n", utc->tm_year + 1900, utc->tm_mon + 1, utc->tm_mday, utc->tm_hour, utc->tm_min, utc->tm_sec);
// ความแตกต่าง printf("Diff: %d hours\n", local->tm_hour - utc->tm_hour); // +7 สำหรับ Bangkok timezone
// C แยก DATE/TIME ผ่าน struct tm fields: // .tm_year, .tm_mon, .tm_mday = DATE // .tm_hour, .tm_min, .tm_sec = TIME // time_t = TIMESTAMP (วินาทีจาก epoch) // localtime/gmtime = timezone conversion
return 0;}import pandas as pdfrom datetime import datetime, date, time, timezone, timedelta
# DATE — วันที่เท่านั้นd = date(2026, 4, 24)print(f"DATE: {d}") # 2026-04-24
# TIME — เวลาเท่านั้นt = time(14, 30, 0)print(f"TIME: {t}") # 14:30:00
# TIMESTAMP (naive — ไม่มี timezone)dt_naive = datetime(2026, 4, 24, 14, 30, 0)print(f"TIMESTAMP: {dt_naive}") # 2026-04-24 14:30:00print(f"tzinfo: {dt_naive.tzinfo}") # None!
# TIMESTAMPTZ (aware — มี timezone)bkk = timezone(timedelta(hours=7))dt_aware = datetime(2026, 4, 24, 14, 30, 0, tzinfo=bkk)print(f"TIMESTAMPTZ: {dt_aware}") # 2026-04-24 14:30:00+07:00
# pandas — tz_localize / tz_convertts = pd.Timestamp("2026-04-24 14:30:00")ts_bkk = ts.tz_localize("Asia/Bangkok")ts_utc = ts_bkk.tz_convert("UTC")print(f"Bangkok: {ts_bkk}") # 2026-04-24 14:30:00+07:00print(f"UTC: {ts_utc}") # 2026-04-24 07:30:00+00:00# เวลาเดียวกัน ต่าง representation!-- DATE: วันที่เท่านั้นCREATE TABLE birthdays ( name VARCHAR(50), birthdate DATE);INSERT INTO birthdays VALUES ('Alice', '1995-06-15');SELECT name, birthdate, AGE(birthdate) FROM birthdays;-- Alice | 1995-06-15 | 30 years 10 mons 9 days
-- TIME: เวลาเท่านั้นCREATE TABLE store_hours ( day_of_week VARCHAR(10), open_time TIME, close_time TIME);INSERT INTO store_hours VALUES ('Monday', '09:00:00', '18:00:00');SELECT close_time - open_time AS hours_open FROM store_hours;-- 09:00:00 (9 ชั่วโมง)
-- TIMESTAMP vs TIMESTAMPTZCREATE TABLE events ( title VARCHAR(100), event_at TIMESTAMP, -- ไม่มี timezone event_atz TIMESTAMPTZ -- มี timezone);
-- ตั้ง timezone ของ sessionSET timezone = 'Asia/Bangkok';
INSERT INTO events VALUES ( 'Meeting', '2026-04-24 14:30:00', '2026-04-24 14:30:00+07');
-- เปลี่ยน timezoneSET timezone = 'America/New_York';
SELECT * FROM events;-- TIMESTAMP: 2026-04-24 14:30:00 (ไม่เปลี่ยน! อันตราย!)-- TIMESTAMPTZ: 2026-04-24 03:30:00-04 (แปลงให้อัตโนมัติ!)Decision Table
Section titled “Decision Table”| สถานการณ์ | ใช้ Type |
|---|---|
| วันเกิด | DATE |
| เวลาเปิด-ปิดร้าน | TIME |
| Event ในบริษัทเดียว timezone เดียว | TIMESTAMP |
| Event ที่มีคนจากหลายประเทศ | TIMESTAMPTZ |
| Log ของ server | TIMESTAMPTZ |
| Created_at / updated_at | TIMESTAMPTZ |