MySQL वर्तमान समय: NOW(), CURDATE(), UTC_TIMESTAMP(), टाइम ज़ोन, और सर्वोत्तम प्रथाएँ

目次

1. MySQL में वर्तमान समय प्राप्त करें (मुख्य बात: सबसे छोटा SQL चीट शीट)

यदि आप MySQL में वर्तमान समय प्राप्त करना चाहते हैं, तो केवल कुछ ही SQL फ़ंक्शन हैं जिन्हें आपको याद रखना चाहिए।
नीचे खोज शब्द “MySQL get current time” के लिए सबसे छोटा उत्तर दिया गया है।

1.1 MySQL वर्तमान तिथि और समय: NOW() / CURRENT_TIMESTAMP

वर्तमान तारीख + समय (YYYY-MM-DD HH:MM:SS) लौटाता है।

SELECT NOW();
SELECT CURRENT_TIMESTAMP;

उदाहरण आउटपुट

2025-02-01 15:30:45
  • NOW() और CURRENT_TIMESTAMP आमतौर पर समान परिणाम देते हैं।
  • दोनों वर्तमान तिथि और समय लौटाते हैं।
  • यदि आपको मिलीसेकंड चाहिए, तो नीचे दिया गया उपयोग करें।
    SELECT NOW(3);
    

नोट्स (सामान्य गलतियाँ)

  • यह सर्वर टाइम ज़ोन सेटिंग पर निर्भर करता है।
  • UTC वातावरण में, आपको जापान समय के बजाय UTC मिल सकता है।
  • क्वेरी निष्पादन के दौरान, यह मूलतः वही समय लौटाता है (एक ही स्टेटमेंट के भीतर स्थिर)।

1.2 MySQL वर्तमान तिथि: CURDATE()

केवल तिथि लौटाता है (समय नहीं)।

SELECT CURDATE();

उदाहरण आउटपुट

2025-02-01

उपयोग के मामले

  • आज के डेटा को क्वेरी करना
  • तिथि तुलना (जैसे, केवल आज के रिकॉर्ड फ़िल्टर करना)

नोट्स

  • लौटाया गया मान DATE प्रकार का है।
  • जब आपको दिन के समय की प्रोसेसिंग चाहिए, तब यह उपयुक्त नहीं है।

1.3 MySQL वर्तमान समय: CURTIME()

केवल समय लौटाता है।

SELECT CURTIME();

उदाहरण आउटपुट

15:30:45

उपयोग के मामले

  • व्यापारिक घंटे की जाँच
  • समय विंडो के आधार पर शाखा लॉजिक

नोट्स

  • इसमें तिथि जानकारी शामिल नहीं है।
  • इसे DATE प्रकार के कॉलम के साथ तुलना नहीं की जा सकती।

1.4 MySQL वर्तमान UTC समय: UTC_TIMESTAMP()

सर्वर टाइम ज़ोन सेटिंग की परवाह किए बिना, UTC (कोऑर्डिनेटेड यूनिवर्सल टाइम) में समय लौटाता है।

SELECT UTC_TIMESTAMP();

उदाहरण आउटपुट

2025-02-01 06:30:45

जब आपको इसका उपयोग करना चाहिए

  • वैश्विक सेवाएँ
  • ऐसे डिज़ाइन जो लॉग को लगातार UTC में संग्रहीत करते हैं

सामान्य गलतियाँ

  • इसे NOW() के साथ मिलाने से समय में अंतर आता है
  • यदि ऐप JST मानता है, तो आपको 9 घंटे का अंतर दिखेगा

1.5 MySQL वर्तमान समय मिलीसेकंड के साथ: NOW(3) / CURRENT_TIMESTAMP(3)

MySQL 5.6 और बाद के संस्करण फ्रैक्शनल सेकंड का समर्थन करते हैं।

SELECT NOW(3);
SELECT CURRENT_TIMESTAMP(3);

उदाहरण आउटपुट

2025-02-01 15:30:45.123

संग्रहण के लिए नोट्स

आपके कॉलम को भी फ्रैक्शनल सेकंड का समर्थन करना चाहिए।

DATETIME(3)
TIMESTAMP(3)

यदि आप इसे असमर्थित कॉलम में संग्रहीत करते हैं, तो फ्रैक्शनल भाग काट दिया जाएगा।

1.6 उद्देश्य के अनुसार त्वरित चीट शीट

PurposeSQL
Current date and timeSELECT NOW();
Get UTCSELECT UTC_TIMESTAMP();
Date onlySELECT CURDATE();
Time onlySELECT CURTIME();
Get millisecondsSELECT NOW(3);

सामान्य जाल सारांश

  • समय में अंतर है क्योंकि आपने टाइम ज़ोन की जाँच नहीं की
  • NOW(3) का उपयोग बिना मिलीसेकंड-सक्षम कॉलम के किया
  • UTC और स्थानीय समय को मिलाना
  • DATETIME और TIMESTAMP के बीच अंतर न समझना

MySQL DATETIME と TIMESTAMP の違いを示した図。TIMESTAMPはUTC変換され、DATETIMEは変換されない。

MySQL DATETIME और TIMESTAMP के बीच अंतर (जाँचते हुए कि टाइम ज़ोन रूपांतरण होता है या नहीं)

2. MySQL NOW() और CURRENT_TIMESTAMP के बीच अंतर

NOW() और CURRENT_TIMESTAMP दिखने में समान हैं, लेकिन कहाँ उपयोग करना है और उनका व्यवहार कैसे है को समझने में गलती आसानी से बग्स का कारण बन सकती है। यहाँ हम अंतर, सही उपयोग, और सामान्य जालों को व्यवस्थित करते हैं।

2.1 आपको कौन सा उपयोग करना चाहिए? (SELECT उपयोग / DEFAULT उपयोग)

■ SELECT में वर्तमान तिथि/समय प्राप्त करते समय

SELECT NOW();
SELECT CURRENT_TIMESTAMP;

आमतौर पर, दोनों समान परिणाम देते हैं।

  • वे समतुल्य हैं (पर्यायवाची)
  • लौटाया गया मान DATETIME के बराबर है
  • टाइम ज़ोन सेटिंग से प्रभावित

व्यावहारिक निष्कर्ष

  • पठनीयता को प्राथमिकता दें → NOW()
  • मानक SQL शैली को प्राथमिकता दें → CURRENT_TIMESTAMP

■ कॉलम डिफ़ॉल्ट मान सेट करते समय

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

यहाँ मुख्य बिंदु है:

डिफ़ॉल्ट मान के लिए, आमतौर पर CURRENT_TIMESTAMP का उपयोग किया जाता है।

कुछ पर्यावरण NOW() की अनुमति देते हैं, लेकिन व्यवहार MySQL संस्करण और SQL मोड के आधार पर अलग हो सकता है। सुरक्षित विकल्प CURRENT_TIMESTAMP है।

2.2 DEFAULT / ON UPDATE का सही उपयोग

यदि आप “updated at” टाइमस्टैम्प को स्वचालित रूप से अपडेट करना चाहते हैं:

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        ON UPDATE CURRENT_TIMESTAMP
);

व्यवहार

  • INSERT पर → created_at / updated_at के लिए वर्तमान समय सेट करता है
  • UPDATE पर → केवल updated_at को अपडेट करता है

सामान्य गलतियाँ

  • DATETIME का उपयोग करते समय अंश-सेकंड की सटीकता से मेल न खाना
  • कई TIMESTAMP कॉलम के साथ पुराने MySQL की सीमाओं का सामना करना (MySQL 5.6 और उससे पहले में प्रतिबंध थे)

2.3 NOW() और SYSDATE() के बीच अंतर (महत्वपूर्ण)

अक्सर नज़रअंदाज़ किया जाने वाला बिंदु SYSDATE() से अंतर है।

SELECT NOW(), SYSDATE();

■ व्यवहार में अंतर

  • NOW() → क्वेरी शुरू होने के समय पर स्थिर रहता है
  • SYSDATE() → कॉल किए जाने के क्षण का समय लौटाता है

उदाहरण:

SELECT NOW(), SLEEP(3), NOW();

NOW() वही मान लौटाता है।

SELECT SYSDATE(), SLEEP(3), SYSDATE();

SYSDATE() 3 सेकंड का अंतर दिखाता है।

2.4 आपको कौन सा उपयोग करना चाहिए?

FunctionBehaviorRecommended use
NOW()Fixed within a queryLogging, consistency-focused
SYSDATE()Call-time valuePrecise real-time retrieval

वास्तविक दुनिया के सिस्टम में NOW() अक्सर क्यों सुझाया जाता है

  • लेनदेन के भीतर स्थिरता बनाए रखता है (एक तंत्र जो कई SQL कथनों को साथ में प्रोसेस करता है)
  • प्रतिकृति पर्यावरण में अधिक सुरक्षित

2.5 सामान्य गलतफहमियां और समस्याएं

❌ “NOW() और CURRENT_TIMESTAMP बिल्कुल समान हैं, इसलिए आपको इसके बारे में सोचना नहीं चाहिए।”

→ अंतर पर्यावरण के आधार पर डिफ़ॉल्ट या अपडेट व्यवहार में दिख सकते हैं।

❌ “SYSDATE() अधिक सटीक है, इसलिए यह हमेशा बेहतर है।”

→ यह प्रतिकृति पर्यावरण में समस्याएँ पैदा कर सकता है।

❌ टाइम ज़ोन की पुष्टि न करना

SHOW VARIABLES LIKE '%time_zone%';

यदि आप इसे बिना जाँच के उपयोग करते हैं, तो समय में अंतर हो सकता है।

2.6 व्यावहारिक सर्वोत्तम प्रथाएँ

  • SELECT पुनर्प्राप्ति → NOW()
  • कॉलम डिफ़ॉल्ट → CURRENT_TIMESTAMP
  • स्वचालित अपडेट → ON UPDATE CURRENT_TIMESTAMP
  • स्थिरता-केंद्रित → डिफ़ॉल्ट NOW()
  • UTC-आधारित डिज़ाइन → TIMESTAMP + UTC में संग्रहीत करें
  1. MySQL वर्तमान समय स्वरूपण (DATE_FORMAT / TIME_FORMAT)
    वर्तमान समय को MySQL में प्राप्त करने के बाद, प्रदर्शन स्वरूप बदलना बहुत आम है।
    खोज इरादा “MySQL current time format” के लिए सबसे महत्वपूर्ण फ़ंक्शन DATE_FORMAT() है।

3.1 MySQL datetime स्वरूपण: DATE_FORMAT(NOW(), …)

बेसिक सिंटैक्स:

sql
SELECT DATE_FORMAT(target_datetime, 'format_string');

उदाहरण: वर्तमान समय को स्वरूपित करना

sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');

उदाहरण आउटपुट

2025-02-01 15:30:45

सामान्यतः उपयोग किए जाने वाले स्वरूप संकेतक

संकेतकअर्थउदाहरण
%Yवर्ष (4 अंक)2025
%mमाह (2 अंक)02
%dदिन (2 अंक)01
%Hघंटा (24‑घंटे)15
%hघंटा (12‑घंटे)03
%iमिनट30
%sसेकंड45
%pAM/PMPM

3.2 जापानी‑शैली या 12‑घंटे स्वरूप में बदलना

■ जापानी‑शैली स्वरूप

sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');

उदाहरण आउटपुट:

2025-02-01 15:30

■ 12‑घंटे स्वरूप + AM/PM

sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %h:%i:%s %p');

उदाहरण आउटपुट:

2025-02-01 03:30:45 PM

3.3 MySQL केवल‑समय स्वरूपण: TIME_FORMAT()

TIME प्रकार के डेटा के लिए विशेष स्वरूपण फ़ंक्शन।

sql
SELECT TIME_FORMAT(CURTIME(), '%H:%i');

उदाहरण आउटपुट:

15:30

नोट्स
TIME_FORMAT() केवल TIME प्रकार के लिए है।
DATETIME के लिए DATE_FORMAT() उपयोग करें।

3.4 स्ट्रिंग → datetime रूपांतरण: STR_TO_DATE()

स्ट्रिंग डेटा को datetime प्रकार में बदलने के लिए:

sql
SELECT STR_TO_DATE('2025-02-01 15:30:45', '%Y-%m-%d %H:%i:%s');

उदाहरण आउटपुट:

2025-02-01 15:30:45

सामान्य गलतियाँ
– स्वरूप असंगति से NULL लौटता है।
%m और %c (शून्य‑पैडेड बनाम बिना शून्य‑पैडेड माह) को भ्रमित करना।

3.5 उत्पादन में महत्वपूर्ण बिंदु

❌ स्वरूपण के बाद तुलना न करें
खराब उदाहरण:

sql
WHERE DATE_FORMAT(created_at, '%Y-%m-%d') = '2025-02-01';

यह सिफ़ारिश नहीं है क्योंकि इंडेक्स अप्रभावी हो जाते हैं (क्वेरी प्रदर्शन घटता है)

सिफ़ारिश:

sql
WHERE created_at >= '2025-02-01' AND created_at < '2025-02-02';

❌ DB पक्ष पर अधिक‑स्वरूपण न करें
वेब एप्लिकेशन में, प्रदर्शन के लिए स्वरूपण आमतौर पर एप्लिकेशन पक्ष पर अधिक लचीला होता है।
डेटाबेस को “संग्रहण और गणना” पर केंद्रित रहना चाहिए।

3.6 मिलीसेकंड के साथ स्वरूपण

sql
SELECT DATE_FORMAT(NOW(3), '%Y-%m-%d %H:%i:%s.%f');

%f माइक्रोसेकंड (6 अंक) दर्शाता है।

नोट
यदि कॉलम DATETIME(3) या समान नहीं है, तो भिन्न भाग काट दिया जाएगा।
MySQL 5.6 और बाद के संस्करणों में उपलब्ध।

3.7 स्वरूपण उद्देश्य के अनुसार सारांश

उद्देश्यफ़ंक्शन
प्रदर्शन स्वरूप बदलनाDATE_FORMAT
केवल समय स्वरूपित करनाTIME_FORMAT
स्ट्रिंग → datetime रूपांतरणSTR_TO_DATE
मिलीसेकंड दिखाना%f

4. MySQL तिथि और समय जोड़/घटाव (DATE_ADD / DATE_SUB)

भले ही आप वर्तमान समय प्राप्त कर लें, उत्पादन में “X दिन बाद” या “X घंटे पहले” जैसी तिथि/समय गणनाओं के बिना इसे प्रभावी रूप से उपयोग नहीं कर सकते
यहाँ हम DATE_ADD() और DATE_SUB() को वर्तमान समय के साथ कैसे उपयोग करें, समझाते हैं।

4.1 MySQL datetime जोड़: DATE_ADD()

बेसिक सिंटैक्स:

sql
SELECT DATE_ADD(base_datetime, INTERVAL value unit);

उदाहरण: अब से 7 दिन बाद

sql
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);

उदाहरण: 2 घंटे बाद

sql
SELECT DATE_ADD(NOW(), INTERVAL 2 HOUR);

सामान्यतः उपयोग किए जाने वाले इकाइयाँ

इकाईअर्थ
SECONDसेकंड
MINUTEमिनट
HOURघंटे
DAYदिन
MONTHमहीने
YEARवर्ष

4.2 MySQL datetime घटाव: DATE_SUB()

बेसिक सिंटैक्स:

sql
SELECT DATE_SUB(base_datetime, INTERVAL value unit);

उदाहरण: 30 दिन पहले

sql
SELECT DATE_SUB(NOW(), INTERVAL 30 DAY);

उदाहरण: 1 घंटा पहले

sql
SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);

उपयोग केस
– समाप्ति जाँच
– पुराने लॉग हटाना
– हालिया डेटा निकालना

4.3 सामान्य उत्पादन पैटर्न

■ पिछले 24 घंटे का डेटा प्राप्त करना

sql
SELECT * FROM logs WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);

■ 7 दिन बाद की डेडलाइन सेट करना

sql
INSERT INTO tasks (deadline) VALUES (DATE_ADD(NOW(), INTERVAL 7 DAY));

4.4 सामान्य गलतियाँ और सावधानियाँ
❌ कॉलम पर फ़ंक्शन लागू करना
खराब उदाहरण:
WHERE DATE(created_at) = CURDATE();
यह इंडेक्स को निष्क्रिय कर देता है (क्वेरी प्रदर्शन अनुकूलन)।
सिफ़ारिश:
WHERE created_at >= CURDATE() AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY);
❌ टाइम ज़ोन को अनदेखा करना
NOW() सर्वर के टाइम ज़ोन पर आधारित है
यदि आप UTC में स्टोर करते हैं, तो बेस के रूप में UTC_TIMESTAMP() उपयोग करें
उदाहरण:
SELECT DATE_ADD(UTC_TIMESTAMP(), INTERVAL 1 DAY);
❌ महीने जोड़ने में जाल
SELECT DATE_ADD('2025-01-31', INTERVAL 1 MONTH);
→ महीने के अंत के समायोजन के कारण तिथि बदल सकती है।
(परिणाम पर्यावरण के अनुसार 2025-02-28 हो सकता है।)
महीने‑आधारित गणनाओं का उपयोग करने से पहले विनिर्देश को समझें।
4.5 मिलीसेकंड के साथ जोड़ना
SELECT DATE_ADD(NOW(3), INTERVAL 500 MILLISECOND);
※ MySQL सीधे MILLISECOND का समर्थन नहीं करता।
माइक्रोसेकंड में निर्दिष्ट करें:
SELECT DATE_ADD(NOW(3), INTERVAL 500000 MICROSECOND);
4.6 सर्वोत्तम प्रथाएँ
NOW() या UTC_TIMESTAMP() को अपने बेस के रूप में मानकीकृत करें
WHERE क्लॉज़ में कॉलम पर फ़ंक्शन न लगाएँ
महीने‑आधारित जोड़ के व्यवहार को समझें
यदि सटीकता आवश्यक है, तो DATETIME(3) या उससे उच्च उपयोग करें

5. MySQL में तिथि/समय अंतर की गणना (DATEDIFF / TIMESTAMPDIFF)

प्रोडक्शन सिस्टम में केवल वर्तमान समय प्राप्त करना पर्याप्त नहीं है। अक्सर आपको कितने दिन बीते या कितने घंटे बचे की गणना करनी पड़ती है।

5.1 तिथि अंतर की गणना: DATEDIFF()

DATEDIFF() दो तिथियों के बीच दिनों का अंतर निकालता है।

SELECT DATEDIFF('2025-02-10', '2025-02-01');

परिणाम

9

मुख्य बिंदु

  • केवल दिनों में अंतर लौटाता है
  • समय भाग को अनदेखा किया जाता है
  • परिणाम नकारात्मक भी हो सकता है

उदाहरण: निर्माण के बाद से बीते दिन

SELECT DATEDIFF(NOW(), created_at)
FROM users;

5.2 इकाई के अनुसार अंतर की गणना: TIMESTAMPDIFF()

TIMESTAMPDIFF() आपको इकाई निर्दिष्ट करने की अनुमति देता है।

SELECT TIMESTAMPDIFF(unit, start_datetime, end_datetime);

उदाहरण: घंटे का अंतर

SELECT TIMESTAMPDIFF(HOUR, '2025-02-01 10:00:00', '2025-02-01 15:00:00');

परिणाम

5

सामान्य इकाइयाँ

UnitMeaning
SECONDSeconds
MINUTEMinutes
HOURHours
DAYDays
MONTHMonths
YEARYears

उदाहरण: लॉगिन के बाद से बीते मिनट

SELECT TIMESTAMPDIFF(MINUTE, login_at, NOW())
FROM users;

5.3 प्रोडक्शन उपयोग केस

  • सत्र टाइमआउट जाँच
  • सब्सक्रिप्शन समाप्ति जाँच
  • लॉग में बीता समय गणना
  • रेट लिमिटिंग लॉजिक

5.4 सामान्य गलतियाँ

❌ जब समय की सटीकता चाहिए तब DATEDIFF का उपयोग करना

DATEDIFF() घंटे और मिनट को अनदेखा करता है।

❌ तर्क क्रम उलटना

क्रम इस प्रकार है:

TIMESTAMPDIFF(unit, start, end)

यदि उलटा किया जाए, तो परिणाम नकारात्मक हो जाता है।

❌ टाइम ज़ोन को अनदेखा करना

यदि UTC और स्थानीय समय को मिलाया जाए, तो अंतर गलत हो सकता है।

5.5 सर्वोत्तम प्रथाएँ

  • जब समय की सटीकता महत्वपूर्ण हो तो TIMESTAMPDIFF() उपयोग करें
  • सरल दिन गणना के लिए DATEDIFF() उपयोग करें
  • टाइम ज़ोन का उपयोग सुसंगत रखें
  • वितरित सिस्टम में UTC को मानकीकृत करें

6. वर्तमान समय का उपयोग करके तिथि रेंज क्वेरीज़

सबसे सामान्य वास्तविक‑दुनिया की आवश्यकताओं में से एक है विशिष्ट समय रेंज के भीतर रिकॉर्ड प्राप्त करना, जैसे:

  • आज के रिकॉर्ड
  • पिछले 7 दिन
  • पिछले 24 घंटे
  • इस महीने के रिकॉर्ड

6.1 आज के रिकॉर्ड प्राप्त करना (इंडेक्स‑फ्रेंडली)

SELECT *
FROM logs
WHERE created_at >= CURDATE()
  AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY);

यह सही क्यों है

  • कॉलम पर कोई फ़ंक्शन लागू नहीं किया गया है
  • इंडेक्स उपयोग योग्य रहते हैं
  • प्रभावी रेंज क्वेरी

6.2 पिछले 7 दिन

SELECT *
FROM logs
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);

6.3 पिछले 24 घंटे

SELECT *
FROM logs
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);

6.4 इस महीने

SELECT *
FROM logs
WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')
  AND created_at < DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH);

उत्पादन प्रणालियों में, अक्सर यह बेहतर होता है कि सीमाओं की गणना एप्लिकेशन पक्ष पर की जाए और उन्हें पैरामीटर के रूप में पास किया जाए।

6.5 सामान्य प्रदर्शन त्रुटियाँ

❌ अनुक्रमित कॉलमों पर फ़ंक्शन लागू करना

WHERE DATE(created_at) = CURDATE();

यह अनुक्रमणिका के उपयोग को रोकता है और पूर्ण तालिका स्कैन का कारण बनता है।

❌ BETWEEN का लापरवाही से उपयोग

BETWEEN समावेशी है और एक-सेकंड की अधिकता/कमी की समस्याएँ पैदा कर सकता है।

6.6 सर्वोत्तम प्रथाओं का सारांश

  • तिथि फ़िल्टरिंग के लिए हमेशा रेंज शर्तों का उपयोग करें
  • अनुक्रमित कॉलमों पर फ़ंक्शन लागू करने से बचें
  • वैश्विक प्रणालियों में UTC संग्रहण को प्राथमिकता दें
  • समय क्षेत्र धारणाओं के बारे में स्पष्ट रहें