4.1 Sheets: Dates Are Numbers
คุณเคย copy วันที่จาก Sheets ไป paste ที่อื่น แล้วได้เลข 45000 กว่าๆ แทนวันที่ไหม? นั่นไม่ใช่ bug — นั่นคือ ค่าจริง ของวันที่
วันที่ = ตัวเลข
Section titled “วันที่ = ตัวเลข”Google Sheets (และ Excel) เก็บวันที่เป็น serial number — ตัวเลขจำนวนเต็มที่นับจำนวนวันตั้งแต่ 30 ธันวาคม 1899
- 1 มกราคม 1900 = 1
- 2 มกราคม 1900 = 2
- วันนี้ (2026) = ตัวเลข 46,000 กว่าๆ
เวลา คือ ส่วนทศนิยม:
- 0.5 = เที่ยงวัน (ครึ่งวัน)
- 0.25 = 6:00 AM (หนึ่งในสี่ของวัน)
- 0.75 = 6:00 PM (สามในสี่ของวัน)
ทำไมสิ่งนี้สำคัญ
Section titled “ทำไมสิ่งนี้สำคัญ”ถ้าคุณเข้าใจว่าวันที่เป็นตัวเลข:
- การลบวันที่ = ลบเลข → ได้จำนวนวัน
- บวก 7 ให้วันที่ = บวกเลข 7 → ได้วันที่ + 1 สัปดาห์
- วันที่กลายเป็นเลขแปลกๆ = format cell ถูกตั้งเป็น number แทน date
พิมพ์ในเซลล์:
=TODAY() → แสดงวันที่ปัจจุบัน=N(TODAY()) → serial number (เช่น 46140)=TODAY() - DATE(2000,1,1) → จำนวนวันตั้งแต่ 1 ม.ค. 2000ลองดู เวลา เป็นทศนิยม:
=N(NOW()) → เช่น 46140.625 (วันที่ + เวลา)=NOW() - TODAY() → ส่วนทศนิยม (เวลาปัจจุบัน)=TEXT(NOW()-TODAY(), "HH:MM:SS") → เวลาปัจจุบันทดลอง format: พิมพ์ 45000 ในเซลล์ แล้วเปลี่ยน format เป็น Date → จะได้วันที่จริง!
ทดลองกลับ: พิมพ์วันที่ แล้วเปลี่ยน format เป็น Number → จะเห็น serial number
#include <stdio.h>#include <time.h>
int main() { // C ใช้ "epoch" ต่างจาก Sheets // time_t = จำนวนวินาทีตั้งแต่ 1 มกราคม 1970 (Unix epoch) time_t now = time(NULL); printf("Unix timestamp: %ld\n", now); // เช่น 1777248000
// แปลงเป็น struct tm ที่อ่านได้ struct tm *t = localtime(&now); printf("%d-%02d-%02d %02d:%02d:%02d\n", t->tm_year + 1900, // ปีเริ่มจาก 1900! t->tm_mon + 1, // เดือนเริ่มจาก 0! t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
// คำนวณความต่าง // 1 วัน = 86400 วินาที time_t tomorrow = now + 86400; struct tm *tmr = localtime(&tomorrow); printf("Tomorrow: %d-%02d-%02d\n", tmr->tm_year + 1900, tmr->tm_mon + 1, tmr->tm_mday);
return 0;}C ใช้ Unix epoch (1 ม.ค. 1970) แทน Sheets epoch (30 ธ.ค. 1899) — concept เดียวกัน แต่จุดเริ่มต้นต่างกัน
import pandas as pdfrom datetime import datetime, timedelta
# Python datetimenow = datetime.now()print(now) # 2026-04-24 15:30:00.123456
# serial number แบบ Sheets (นับวันจาก 1899-12-30)sheets_epoch = datetime(1899, 12, 30)serial = (now - sheets_epoch).daysprint(f"Sheets serial: {serial}") # ~46140
# Unix timestamp (วินาทีจาก 1970-01-01)print(f"Unix timestamp: {now.timestamp()}")
# pandas Timestampts = pd.Timestamp("2026-04-24")print(ts) # 2026-04-24 00:00:00print(ts + timedelta(days=7)) # 2026-05-01 — เพิ่ม 1 สัปดาห์
# คำนวณความต่างdiff = pd.Timestamp("2026-12-31") - pd.Timestamp("2026-01-01")print(f"Days in 2026: {diff.days}") # 364-- SQL มี type สำหรับวันที่โดยเฉพาะ (ไม่ใช่ serial number)SELECT CURRENT_DATE; -- 2026-04-24SELECT CURRENT_TIMESTAMP; -- 2026-04-24 15:30:00+07
-- คำนวณความต่างSELECT DATE '2026-12-31' - DATE '2026-01-01';-- 364 (จำนวนวัน)
-- บวกวันSELECT DATE '2026-04-24' + INTERVAL '7 days';-- 2026-05-01
-- ดึงส่วนประกอบSELECT EXTRACT(YEAR FROM DATE '2026-04-24') AS yr, -- 2026 EXTRACT(MONTH FROM DATE '2026-04-24') AS mo, -- 4 EXTRACT(DOW FROM DATE '2026-04-24') AS dow; -- day of weekเปรียบเทียบ Epoch
Section titled “เปรียบเทียบ Epoch”| เครื่องมือ | Epoch (จุดเริ่มต้น) | หน่วย |
|---|---|---|
| Google Sheets / Excel | 30 ธ.ค. 1899 | วัน (+ ทศนิยมสำหรับเวลา) |
| C / Unix | 1 ม.ค. 1970 | วินาที |
Python datetime | ไม่มี epoch ชัดเจน | object (ปี/เดือน/วัน) |
| SQL | ไม่มี epoch ชัดเจน | type เฉพาะ (DATE, TIMESTAMP) |