MySQL / Date функцүүд

Date функцүүд

MySQL нь огноо, цагтай ажиллах баялаг функцтэй. Захиалгын огноо, хэрэглэгчийн идэвхтэй байдал, хугацааны тайлан гаргахад зайлшгүй.

Огнооны суурь төрлүүд

sql
DATE        -- '2025-01-15'              (огноо)
TIME        -- '14:30:00'               (цаг)
DATETIME    -- '2025-01-15 14:30:00'    (огноо + цаг)
TIMESTAMP   -- '2025-01-15 14:30:00'    (UTC хөрвүүлэлттэй)

TIMESTAMP нь сервер timezone өөрчлөгдөхөд автоматаар хөрвүүлдэг. Олон улсын аппликейшнд ашигтай.

Одоогийн огноо ба цаг авах

sql
SELECT NOW();          -- '2025-01-15 14:30:00'  (огноо + цаг)
SELECT CURDATE();      -- '2025-01-15'            (зөвхөн огноо)
SELECT CURTIME();      -- '14:30:00'              (зөвхөн цаг)
SELECT SYSDATE();      -- NOW()-тэй адил

-- Unix timestamp (1970-01-01-ээс хойшхи секунд)
SELECT UNIX_TIMESTAMP();           -- 1736945400
SELECT UNIX_TIMESTAMP(NOW());      -- мөн адил
SELECT FROM_UNIXTIME(1736945400);  -- '2025-01-15 14:30:00' буцаах

DATE_FORMAT — форматлах

sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');          -- 2025-01-15
SELECT DATE_FORMAT(NOW(), '%d/%m/%Y');          -- 15/01/2025
SELECT DATE_FORMAT(NOW(), '%Y оны %m сарын %d'); -- 2025 оны 01 сарын 15
SELECT DATE_FORMAT(NOW(), '%H:%i:%s');          -- 14:30:00
SELECT DATE_FORMAT(NOW(), '%W, %M %d, %Y');    -- Wednesday, January 15, 2025

Нийтлэг форматын тэмдэгтүүд:

| Тэмдэгт | Утга | | ------- | --------------------- | | %Y | 4 оронтой жил (2025) | | %m | Сар тоогоор (01–12) | | %d | Өдөр (01–31) | | %H | Цаг 24h (00–23) | | %i | Минут (00–59) | | %s | Секунд (00–59) | | %W | Гарагийн нэр (Monday) | | %M | Сарын нэр (January) |

YEAR, MONTH, DAY — хэсэг авах

sql
SELECT YEAR(NOW());    -- 2025
SELECT MONTH(NOW());   -- 1
SELECT DAY(NOW());     -- 15
SELECT HOUR(NOW());    -- 14
SELECT MINUTE(NOW());  -- 30
SELECT SECOND(NOW());  -- 0

-- Практик хэрэглээ: жилийн тайлан шүүх
SELECT * FROM orders
WHERE YEAR(created_at) = 2025
  AND MONTH(created_at) = 1;

DATEDIFF — огнооны зөрүү

sql
-- Хоёр огнооны хоорондох хоног
SELECT DATEDIFF('2025-12-31', '2025-01-01');  -- 364

-- Хэрэглэгч хэдэн хоног өмнө бүртгүүлсэн
SELECT username, DATEDIFF(NOW(), created_at) AS бүртгүүлснөөс_хоног
FROM users
ORDER BY бүртгүүлснөөс_хоног;

-- Хугацаа дууссан захиалгууд (30 хоногоос хуучин)
SELECT * FROM orders
WHERE DATEDIFF(NOW(), created_at) > 30;

DATE_ADD ба DATE_SUB — огноо тооцох

sql
-- DATE_ADD(огноо, INTERVAL тоо нэгж)
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);     -- 7 хоногийн дараа
SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);   -- 1 сарын дараа
SELECT DATE_ADD(NOW(), INTERVAL 1 YEAR);    -- 1 жилийн дараа
SELECT DATE_ADD(NOW(), INTERVAL 2 HOUR);    -- 2 цагийн дараа

-- DATE_SUB(огноо, INTERVAL тоо нэгж)
SELECT DATE_SUB(NOW(), INTERVAL 30 DAY);    -- 30 хоногийн өмнө
sql
-- Практик: дансны хугацаа дуусах огноо тооцох
UPDATE subscriptions
SET expires_at = DATE_ADD(NOW(), INTERVAL 1 MONTH)
WHERE user_id = 42;

-- Сүүлийн 7 хоногийн захиалгууд
SELECT * FROM orders
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);

INTERVAL-н нэгжүүд: SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR

TIMESTAMPDIFF — нарийн зөрүү

sql
-- Нас тооцох
SELECT TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS нас
FROM users;

-- Хэдэн сарын өмнө гэж гаргах
SELECT TIMESTAMPDIFF(MONTH, created_at, NOW()) AS сар
FROM users;

-- Хэдэн минутын өмнө идэвхтэй байсан
SELECT username,
  TIMESTAMPDIFF(MINUTE, last_seen, NOW()) AS минутын_өмнө
FROM users
ORDER BY last_seen DESC;

Хэрэгтэй хослол: тайлан гаргах

sql
-- Сар тус бүрийн захиалгын тоо ба нийт орлого
SELECT
  DATE_FORMAT(created_at, '%Y-%m') AS сар,
  COUNT(*)                          AS захиалга,
  SUM(amount)                       AS орлого
FROM orders
WHERE YEAR(created_at) = 2025
GROUP BY DATE_FORMAT(created_at, '%Y-%m')
ORDER BY сар;
код
сар     | захиалга | орлого
--------|----------|------
2025-01 | 145      | 4350000
2025-02 | 132      | 3960000
2025-03 | 189      | 5670000

Дараагийн хичээлд:

Index — query хурдасгах, шинжлэх зарчим болон хэрхэн зөв index үүсгэхийг үзнэ.