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 үүсгэхийг үзнэ.