Muda wa Sasa wa MySQL: NOW(), CURDATE(), UTC_TIMESTAMP(), Majira ya Muda, na Mazoezi Bora

目次

1. Pata Muda wa Sasa katika MySQL (Hitimisho: Jalada la SQL fupi zaidi)

Ikiwa unataka kupata muda wa sasa katika MySQL, kuna tu baadhi ya kazi za SQL unazohitaji kukumbuka.
Hapo chini ni jibu fupi zaidi kwa neno la utafutaji “MySQL get current time”.

1.1 Tarehe na muda wa sasa wa MySQL: NOW() / CURRENT_TIMESTAMP

Inarudisha tarehe + muda wa sasa (YYYY-MM-DD HH:MM:SS).

SELECT NOW();
SELECT CURRENT_TIMESTAMP;

Mfano wa matokeo

2025-02-01 15:30:45
  • NOW() na CURRENT_TIMESTAMP kwa kawaida hurudisha matokeo sawa.
  • Zote hurudisha tarehe na muda wa sasa.
  • Ikiwa unahitaji milisekunde, tumia yafuatayo.
    SELECT NOW(3);
    

Vidokezo (makosa ya kawaida)

  • Inategemea mipangilio ya eneo la saa la seva.
  • Katika mazingira ya UTC, unaweza kupata UTC badala ya saa ya Japani.
  • Wakati wa utekelezaji wa swali, kwa msingi hurudisha muda huo huo (imewekwa ndani ya tambo moja).

1.2 Tarehe ya sasa ya MySQL: CURDATE()

Inarudisha tu tarehe (bila muda).

SELECT CURDATE();

Mfano wa matokeo

2025-02-01

Matumizi

  • Kuuliza data ya leo
  • Ulinganisho wa tarehe (kwa mfano, chuja rekodi za leo pekee)

Vidokezo

  • Thamani inayorudishwa ni aina ya DATE.
  • Haifai wakati unahitaji usindikaji wa muda wa siku.

1.3 Muda wa sasa wa MySQL: CURTIME()

Inarudisha tu muda.

SELECT CURTIME();

Mfano wa matokeo

15:30:45

Matumizi

  • Ukaguzi wa saa za biashara
  • Mantiki ya matawi kulingana na dirisha la muda

Vidokezo

  • Haina taarifa ya tarehe.
  • Haiwezi kutumika kulinganisha na safu za aina ya DATE.

1.4 Muda wa UTC wa MySQL: UTC_TIMESTAMP()

Inarudisha muda katika UTC (Coordinated Universal Time), bila kujali mipangilio ya eneo la saa la seva.

SELECT UTC_TIMESTAMP();

Mfano wa matokeo

2025-02-01 06:30:45

Wakati wa kutumia

  • Huduma za kimataifa
  • Miundo inayohifadhi logi katika UTC kwa uthabiti

Makosa ya kawaida

  • Kuchanganya na NOW() husababisha tofauti za muda
  • Ikiwa programu inadhania JST, utaona tofauti ya masaa 9

1.5 Muda wa sasa wa MySQL na milisekunde: NOW(3) / CURRENT_TIMESTAMP(3)

MySQL 5.6 na baadaye inaunga mkono sekunde za sehemu.

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

Mfano wa matokeo

2025-02-01 15:30:45.123

Vidokezo vya kuhifadhi

Safu yako lazima pia iunge mkono sekunde za sehemu.

DATETIME(3)
TIMESTAMP(3)

Kama uihifadhi katika safu isiyounga mkono, sehemu ya sehemu itakatwa.

1.6 Jalada la haraka kwa madhumuni

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

Muhtasari wa vizingiti vya kawaida

  • Muda unaonekana tofauti kwa sababu hukuthibitisha eneo la saa
  • Kutumia NOW(3) bila safu inayoweza kushikilia milisekunde
  • Kuchanganya UTC na muda wa eneo
  • Kutofahamu tofauti kati ya DATETIME na TIMESTAMP

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

Tofauti kati ya MySQL DATETIME na TIMESTAMP (kulinganisha ikiwa ubadilishaji wa eneo la saa unatokea)

2. Tofauti kati ya MySQL NOW() na CURRENT_TIMESTAMP

NOW() na CURRENT_TIMESTAMP zinaonekana sawa, lakini kuelewa vibaya wapi wa kuzitumia na jinsi zinavyotenda kunaweza kusababisha hitilafu. Hapa tunajumuisha tofauti, matumizi sahihi, na vizingiti vya kawaida.

2.1 Unapaswa kutumia ipi? (Matumizi ya SELECT / Matumizi ya DEFAULT)

■ Wakati wa kupata tarehe/muda wa sasa katika SELECT

SELECT NOW();
SELECT CURRENT_TIMESTAMP;

Kawaida, zote hurudisha matokeo sawa.

  • Zinafanana (maneno yanayofanana)
  • Thamani inayorudishwa ni sawa na DATETIME
  • Inategemea mipangilio ya eneo la saa

Hitimisho la kimantiki

  • Pendekeza usomaji rahisi → NOW()
  • Pendekeza mtindo wa SQL wa kawaida → CURRENT_TIMESTAMP

■ Wakati wa kuweka thamani ya chaguo-msingi ya safu

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

Jambo kuu hapa ni:

Kwa thamani ya chaguo-msingi, kawaida hutumia CURRENT_TIMESTAMP.

Baadhi ya mazingira huruhusu NOW() pia, lakini tabia inaweza kutofautiana kulingana na toleo la MySQL na hali ya SQL. Chaguo salama zaidi ni CURRENT_TIMESTAMP.

2.2 Matumizi sahihi ya DEFAULT / ON UPDATE

Kama unataka kusasisha kiotomatiki timestamp ya “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
);

Tabia

  • Katika INSERT → inaweka wakati wa sasa kwa created_at / updated_at
  • Katika UPDATE → husasisha updated_at pekee

Makosa ya kawaida

  • Kutolingana usahihi wa sehemu ya sekunde wakati wa kutumia DATETIME
  • Kukumbana na vikwazo vya MySQL vya zamani na safu nyingi za TIMESTAMP (MySQL 5.6 na mapema yalikuwa na vizuizi)

2.3 Toifauti Kati ya NOW() na SYSDATE() (Muhimu)

Jambo rahisi kupuuza ni tofauti kutoka SYSDATE().

SELECT NOW(), SYSDATE();

■ Tofauti za tabia

  • NOW() → imara wakati wa kuanza kwa swali
  • SYSDATE() → inarejesha wakati katika wakati huo inapoitwa

Mfano:

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

NOW() inarejesha thamani ileile.

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

SYSDATE() inaonyesha tofauti ya sekunde 3.

2.4 Ni ipi unapaswa kutumia?

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

Kwa nini NOW() mara nyingi inapendekezwa katika mifumo ya ulimwengu halisi

  • Inahifadhi uthabiti ndani ya muamala (mekaniki inayochakata tamko nyingi za SQL pamoja)
  • Salama zaidi katika mazingira ya urejelezi

2.5 Uelewa usio sahihi na masuala

❌ “NOW() na CURRENT_TIMESTAMP ni sawa kabisa, kwa hivyo huna haja ya kufikiria juu yake.”

→ Tofauti zinaweza kuonekana katika difoti au tabia ya usasishaji, kulingana na mazingira.

❌ “SYSDATE() ni sahihi zaidi, kwa hivyo daima ni bora.”

→ Inaweza kusababisha matatizo katika mazingira ya urejelezi.

❌ Kutathmini kanda ya saa

SHOW VARIABLES LIKE '%time_zone%';

Kama utaitumia bila kukagua, unaweza kupata makosa ya muda.

2.6 Mazoea bora ya kiutendaji

  • Utoaji wa SELECT → NOW()
  • Difoti ya safu → CURRENT_TIMESTAMP
  • Sasisha kiotomatiki → ON UPDATE CURRENT_TIMESTAMP
  • Kuelekezwa kwa uthabiti → difoti kwa NOW()
  • Ubunifu kulingana na UTC → TIMESTAMP + hifadhi katika UTC
  1. Umefomati wa Wakati wa Sasa wa MySQL (DATE_FORMAT / TIME_FORMAT)
    Baada ya kupata wakati wa sasa katika MySQL, ni kawaida sana kubadilisha umefomati wa kuonyesha.
    Kwa nia ya utafutaji “MySQL current time format,” function muhimu zaidi kuelewa ni DATE_FORMAT().
    3.1 Umefomati wa datetime ya MySQL: DATE_FORMAT(NOW(), …)
    Sintaksisi ya msingi:
    SELECT DATE_FORMAT(target_datetime, 'format_string');
    Mfano: umefomati wakati wa sasa
    SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
    Mfano wa pato
    2025-02-01 15:30:45
    Vifaa vya umefomati vinavyotumiwa sana
    Specifier
    Maana
    Mfano
    %Y
    Mwaka (tarakimu 4)
    2025
    %m
    Mwezi (tarakimu 2)
    02
    %d
    Siku (tarakimu 2)
    01
    %H
    Saa (saa 24)
    15
    %h
    Saa (saa 12)
    03
    %i
    Dakika
    30
    %s
    Sekunde
    45
    %p
    AM/PM
    PM
    3.2 Kubadilisha kuwa umefomati wa mtindo wa Kijapani au saa 12
    ■ Umefomati wa mtindo wa Kijapani
    SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');
    Mfano wa pato:
    2025-02-01 15:30
    ■ Umefomati wa saa 12 + AM/PM
    SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %h:%i:%s %p');
    Mfano wa pato:
    2025-02-01 03:30:45 PM
    3.3 Umefomati wa wakati pekee wa MySQL: TIME_FORMAT()
    Function ya umefomati maalum kwa data ya aina ya TIME.
    SELECT TIME_FORMAT(CURTIME(), '%H:%i');
    Mfano wa pato:
    15:30
    Masharti
    TIME_FORMAT() ni kwa aina ya TIME pekee
    Kwa DATETIME, tumia DATE_FORMAT()
    3.4 Kubadilisha kutoka String → datetime: STR_TO_DATE()
    Ili kubadilisha data ya string kuwa aina ya datetime:
    SELECT STR_TO_DATE('2025-02-01 15:30:45', '%Y-%m-%d %H:%i:%s');
    Mfano wa pato:
    2025-02-01 15:30:45
    Makosa ya kawaida
    Kutoambatana kwa umefomati kunarudisha NULL
    Kuchanganya %m na %c (mwezi ulio na zero-padded dhidi ya bila zero-padded)
    3.5 Mambo muhimu katika uzalishaji
    ❌ Usilinganishe baada ya kufomati
    Mfano mbaya:
    WHERE DATE_FORMAT(created_at, '%Y-%m-%d') = '2025-02-01';
    Hii haipendekezwi kwa sababu indeksia hazifanyi kazi (utendaji wa swali hupungua).
    Inayopendekezwa:
    WHERE created_at >= '2025-02-01' AND created_at < '2025-02-02';
    ❌ Usifomati kupita kiasi upande wa DB
    Katika programu za wavuti, umefomati wa kuonyesha huwa rahisi zaidi upande wa programu
    Hifadhidata inapaswa kuzingatia “uhifadhi na hesabu”
    3.6 Umefomati na milisekunde
    SELECT DATE_FORMAT(NOW(3), '%Y-%m-%d %H:%i:%s.%f');
    %f inawakilisha microseconds (tarakimu 6).
    Masharti
    Ikiwa safu si DATETIME(3) au sawa, sehemu ya kufikia itakatwa
    Inapatikana katika MySQL 5.6 na zaidi
    3.7 Muhtasari kwa kusudi la umefomati
    Kusudi
    Function
    Badilisha umefomati wa kuonyesha
    DATE_FORMAT
    Fomati wakati pekee
    TIME_FORMAT
    Kubadilisha String → datetime
    STR_TO_DATE
    Onyesha milisekunde
    %f
  2. Ongezeko/Lapunguzo la Tarehe na Wakati wa MySQL (DATE_ADD / DATE_SUB)
    Hata kama unaweza kupata wakati wa sasa, huwezi kuitumia kwa ufanisi katika uzalishaji bila hesabu za tarehe/wakati kama “siku X baadaye” au “saa X zilizopita.”
    Hapa tunaeleza jinsi ya kutumia DATE_ADD() na DATE_SUB() na wakati wa sasa katika MySQL.
    4.1 Ongezeko la datetime ya MySQL: DATE_ADD()
    Sintaksisi ya msingi:
    SELECT DATE_ADD(base_datetime, INTERVAL value unit);
    Mfano: siku 7 kutoka sasa
    SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
    Mfano: saa 2 baadaye
    SELECT DATE_ADD(NOW(), INTERVAL 2 HOUR);
    Vitu vinavyotumiwa sana
    Unit
    Maana
    SECOND
    Sekunde
    MINUTE
    Dakika
    HOUR
    Saa
    DAY
    Siku
    MONTH
    Miezi
    YEAR
    Maka
    4.2 Lapunguzo la datetime ya MySQL: DATE_SUB()
    Sintaksisi ya msingi:
    SELECT DATE_SUB(base_datetime, INTERVAL value unit);
    Mfano: siku 30 zilizopita
    SELECT DATE_SUB(NOW(), INTERVAL 30 DAY);
    Mfano: saa 1 iliyopita
    SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);
    Matumizi
    Angalia mwisho
    Kufuta magunia ya zamani
    Kutoa data ya hivi karibuni
    4.3 Mifumo ya kawaida ya uzalishaji
    ■ Pata data kutoka saa 24 zilizopita
    SELECT * FROM logs WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);
    ■ Weka tarehe ya mwisho siku 7 baadaye
    INSERT INTO tasks (deadline) VALUES (DATE_ADD(NOW(), INTERVAL 7 DAY));

4.4 Makosa ya kawaida na tahadhari
❌ Kutumia kazi kwenye safu wima
Mfano mbaya:
WHERE DATE(created_at) = CURDATE();
Hii inazima faharasa (utendaji wa maswali).
Pendekezo:
WHERE created_at >= CURDATE() AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY);
❌ Kupuuza majira ya saa
NOW() inategemea majira ya saa ya seva
Kama unahifadhi katika UTC, tumia UTC_TIMESTAMP() kama msingi
Mfano:
SELECT DATE_ADD(UTC_TIMESTAMP(), INTERVAL 1 DAY);
❌ Vizingiti vya kuongeza mwezi
SELECT DATE_ADD('2025-01-31', INTERVAL 1 MONTH);
→ Kwa sababu ya marekebisho ya mwisho wa mwezi, tarehe inaweza kubadilika.
(Matokeo yanaweza kuwa 2025-02-28 kulingana na mazingira.)
Elewa maelezo kabla ya kutumia mahesabu yanayotokana na miezi.
4.5 Kuongeza kwa milisekunde
SELECT DATE_ADD(NOW(3), INTERVAL 500 MILLISECOND);
※ MySQL haiauni MILLISECOND moja kwa moja.
Eleza kwa microseconds:
SELECT DATE_ADD(NOW(3), INTERVAL 500000 MICROSECOND);
4.6 Mazoea bora
Sanidi kutumia NOW() au UTC_TIMESTAMP() kama msingi wako
Usitumie kazi kwenye safu wima katika kifungu cha WHERE
Elewa tabia ya kuongeza kwa mwezi
Kama unahitaji usahihi, tumia DATETIME(3) au zaidi

5. Kuhesabu Tofauti za Tarehe/Saa katika MySQL (DATEDIFF / TIMESTAMPDIFF)

Katika mifumo ya uzalishaji, kupata tu wakati wa sasa haitoshi. Mara nyingi unahitaji kuhesabu siku ngapi zimepita au masaa mangapi yanabaki.

5.1 Kuhesabu tofauti za tarehe: DATEDIFF()

DATEDIFF() huhesabu tofauti kwa siku kati ya tarehe mbili.

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

Matokeo

9

Mambo Muhimu

  • Hurejesha tofauti katika siku pekee
  • Sehemu ya muda inapuuzwa
  • Matokeo yanaweza kuwa hasi

Mfano: hesabu siku tangu uundaji

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

5.2 Kuhesabu tofauti kwa kitengo: TIMESTAMPDIFF()

TIMESTAMPDIFF() inakuwezesha kubainisha kitengo.

SELECT TIMESTAMPDIFF(unit, start_datetime, end_datetime);

Mfano: tofauti ya masaa

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

Matokeo

5

Vitengo vya kawaida

UnitMeaning
SECONDSeconds
MINUTEMinutes
HOURHours
DAYDays
MONTHMonths
YEARYears

Mfano: hesabu dakika tangu kuingia

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

5.3 Matumizi katika uzalishaji

  • Ukaguzi wa muda wa kikao
  • Ukaguzi wa kumalizika kwa usajili
  • Kuhesabu muda uliopita katika logi
  • Mantiki ya kupunguza kasi

5.4 Makosa ya kawaida

❌ Kutumia DATEDIFF wakati usahihi wa muda unahitajika

DATEDIFF() inapuuzia masaa na dakika.

❌ Kubadilisha mpangilio wa hoja

Mpangilio ni:

TIMESTAMPDIFF(unit, start, end)

Ukibadilisha, matokeo yatakuwa hasi.

❌ Kupuuza majira ya saa

Kama unachanganya UTC na saa za eneo, tofauti zinaweza kuwa zisizo sahihi.

5.5 Mazoea bora

  • Tumia TIMESTAMPDIFF() wakati usahihi wa muda una umuhimu
  • Tumia DATEDIFF() kwa mahesabu rahisi ya siku
  • Hakikisha matumizi ya majira ya saa yanayofanana
  • Sanidi kutumia UTC katika mifumo iliyogawanyika

6. Maswali ya Mipaka ya Tarehe kwa Kutumia Wakati wa Sasa

Moja ya mahitaji ya kawaida katika dunia halisi ni kupata rekodi ndani ya kipengele cha muda maalum, kama vile:

  • Rekodi za leo
  • Siku 7 zilizopita
  • Saa 24 zilizopita
  • Mwezi huu

6.1 Kupata rekodi za leo (inayofaa kwa faharasa)

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

Kwa nini hii ni sahihi

  • Hakuna kazi inayotumika kwenye safu wima
  • Faharasa hubaki inatumika
  • Maswali ya kipengele yanayofaa

6.2 Siku 7 zilizopita

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

6.3 Saa 24 zilizopita

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

6.4 Mwezi huu

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);

Katika mifumo ya uzalishaji, mara nyingi ni bora kuhesabu mipaka upande wa programu na kuipita kama vigezo.

6.5 Makosa ya kawaida ya utendaji

❌ Kutumia kazi kwenye safu zilizopangwa

WHERE DATE(created_at) = CURDATE();

Hii inazuia matumizi ya faharasa na husababisha uchunguzi kamili wa jedwali.

❌ Kutumia BETWEEN bila tahadhari

BETWEEN ni jumuishi na inaweza kusababisha matatizo ya sekunde moja kupita.

6.6 Muhtasari wa mbinu bora

  • Daima tumia masharti ya safu kwa uchujaji wa tarehe
  • Epuka kutumia kazi kwenye safu zilizopangwa
  • Pendekeza uhifadhi wa UTC katika mifumo ya kimataifa
  • Kuwa wazi kuhusu dhana za eneo la saa