MySQL Timestamp ya Sasa: NOW(), CURRENT_TIMESTAMP, SYSDATE(), UTC, na Miongozo Bora

目次

1. SQL fupi zaidi kupata tarehe/msaiko wa sasa katika MySQL

Ikiwa unataka kupata tarehe/msaiko wa sasa katika MySQL, kazi za kwanza za kukumbuka ni NOW() na CURRENT_TIMESTAMP. Hapo chini kuna mifano fupi zaidi ya SQL kulingana na kesi ya matumizi.

1.1 Pata tarehe/msaiko wa sasa (msingi)

SELECT NOW();

au

SELECT CURRENT_TIMESTAMP;
  • Zote zinaonyesha tarehe/msaiko wa sasa (YYYY-MM-DD HH:MM:SS) .
  • Katika swali lile lile, muda unabaki thabiti katika “muda wa kuanza kwa swali.”

Kesi za matumizi

  • Kurekodi logi
  • Kupata alama ya wakati wa uundaji wa rekodi
  • Kupata wakati wa rejea

Hitilafu ya kawaida

  • Ukanda wa muda wa programu na ukanda wa muda wa DB hutofautiana na “mabadiliko ya muda.” → Angalia kwa SELECT @@session.time_zone;

1.2 Pata tarehe ya leo pekee

SELECT CURDATE();
  • Muundo wa kurudi: YYYY-MM-DD
  • Aina ni DATE (tarehe pekee, si datetime)

Kesi za matumizi

  • Kutafuta “data ya leo”
  • Muungano wa kila siku

Vidokezo

  • Tofauti na NOW(), haijumuishi muda.
  • Ikiwa unahitaji muda kwa maswali ya safu, tumia NOW() .

1.3 Pata muda wa sasa pekee

SELECT CURTIME();
  • Muundo wa kurudi: HH:MM:SS
  • Aina ni TIME (muda pekee)

Kesi za matumizi

  • Kuonyesha muda wa utekelezaji wa batch
  • Kuchapisha sehemu ya muda pekee katika logi

Kukosea kwa kawaida

  • Kwa sababu haijumuishi tarehe, huwezi kuitumia kulinganisha datetime.

1.4 Pata muda wa sasa katika UTC (muhimu)

SELECT UTC_TIMESTAMP();
  • Hurejesha UTC bila kujali ukanda wa muda wa seva.
  • Inapendekezwa kwa huduma za kimataifa.

Sera ya msingi katika miradi halisi

  • Hifadhi katika UTC
  • Badilisha kuwa muda wa eneo unapoonyesha

Vidokezo

  • Ikiwa programu tayari hubadilisha hadi UTC, tahadhari ya ubadilishaji mara mbili.

1.5 Pata milisekunde / mikrosekonzi

SELECT NOW(3);  -- milliseconds (3 digits after the decimal point)
SELECT NOW(6);  -- microseconds (6 digits after the decimal point)
  • Inapatikana katika MySQL 5.6.4 na baadaye.
  • Inatumika kwa logi za usahihi wa juu na ukaguzi wa miamala.

Udhara wa kawaida

  • NOW() peke yake haiwezi kurudisha sekunde za sehemu.
  • Safu yako lazima pia itoe usahihi, mfano DATETIME(6) .

1.6 Kazi bora kulingana na kesi ya matumizi (anza hapa ikiwa hauna uhakika)

Use caseRecommended function
General current datetimeNOW()
Table default valueCURRENT_TIMESTAMP
Date onlyCURDATE()
Time onlyCURTIME()
Unified UTC managementUTC_TIMESTAMP()
High-precision logsNOW(6)

Vidokezo muhimu ambavyo watu mara nyingi hupuuza

  • NOW() na CURRENT_TIMESTAMP ni sawa kimsingi (thamani sawa)
  • Katika swali lile lile, muda ni thabiti
  • Thamani inayoonyeshwa hubadilika kulingana na mipangilio ya ukanda wa muda
  • Kwa mikrosekonzi, ufafanuzi wa safu yako lazima ueleze usahihi

2. Tofauti kati ya NOW() / CURRENT_TIMESTAMP / SYSDATE()

Kuna kazi nyingi za kupata muda wa sasa, lakini sehemu inayochanganya zaidi ni tofauti kati ya NOW(), CURRENT_TIMESTAMP, na SYSDATE(). Ikiwa hauiuelewi vizuri, unaweza kupata tabia isiyotarajiwa katika logi na usindikaji wa miamala.

2.1 NOW() na CURRENT_TIMESTAMP ni sawa kimsingi

SELECT NOW(), CURRENT_TIMESTAMP;
  • Zote hurudisha datetime ya sasa (thamani ya DATETIME) .
  • Katika swali lile lile, muda ni thabiti katika “muda wa kuanza kwa swali.”
  • CURRENT_TIMESTAMP pia inaweza kutumika kwa muundo wa kuita kazi:
    SELECT CURRENT_TIMESTAMP();
    

Jinsi ya kuchagua katika miradi halisi

Use caseRecommended
Simple retrievalNOW()
Table DEFAULT / ON UPDATECURRENT_TIMESTAMP

Vidokezo muhimu

  • Maana ya thamani iliyopatikana ni sawa.
  • Tofauti kuu ni muundo/utumiaji (kwa mfano, inaruhusiwa katika DEFAULT).
  • Si tofauti ya aina (rahisi kupotosha).

2.2 SYSDATE() hurudisha muda katika “muda wa tathmini”

SYSDATE() inaonekana kama NOW(), lakini muda wa kutimiza thamani ni tofauti.

SELECT NOW(), SLEEP(2), NOW();

Matokeo (mfano):

2025-02-23 14:00:00
2025-02-23 14:00:00
SELECT SYSDATE(), SLEEP(2), SYSDATE();

Matokeo (mfano):

2025-02-23 14:00:00
2025-02-23 14:00:02

Tofauti ya msingi

FunctionWhen the time is fixed
NOW()Query start time
SYSDATE()Evaluation time

2.3 Vidokezo vya miamala na urambazaji

Kwa sababu NOW() inasimama katika mwanzo wa swali, ni
salama zaidi unapohitaji muda wa kumbukumbu thabiti ndani ya muamala.

Kwa upande mwingine, kwa sababu SYSDATE() inategemea muda wa utekelezaji, inaweza kuathiri uratibu katika:

  • Ururambazaji
  • Kazi za batch
  • Uchakataji wa logi kwa wingi

Kanuni ya jumla

  • Unataka muda wa kumbukumbu uliosimama → NOW()
  • Unahitaji wakati halisi kila wakati → SYSDATE() (matumizi machache)

2.4 Kumbuka: CURRENT_DATE / CURRENT_TIME / LOCALTIME

MySQL pia inaunga mkono:

SELECT CURRENT_DATE;
SELECT CURRENT_TIME;
SELECT LOCALTIME;
  • CURRENT_DATE → sawa na CURDATE()
  • CURRENT_TIME → sawa na CURTIME()
  • LOCALTIME → sawa na NOW()

Uchanganyiko wa kawaida

  • Hizi ni tofauti za muonekano tu; tofauti za kazi ni ndogo sana.
  • Kwa usalama, pendelea usomaji na ufanikishe ndani ya mradi.

Muhtasari muhimu wa sehemu hii

  • NOW() na CURRENT_TIMESTAMP maana yake ni sawa kabisa.
  • SYSDATE() inafanya tofauti kwa sababu inategemea muda wa tathmini.
  • Kwa nyakati za kumbukumbu zilizosimama, tumia NOW() kama chaguo-msingi.
  • Tumia CURRENT_TIMESTAMP kwa DEFAULT na ON UPDATE.

3. Badilisha muundo wa kuonyesha tarehe/muda wa sasa

Muda wa sasa unaopata kwa NOW() unaonyeshwa kwa chaguo-msingi kama YYYY-MM-DD HH:MM:SS. Katika kazi halisi, mara nyingi utahitaji vitu kama:

  • Onyesha tarehe pekee
  • Tumia YYYY/MM/DD
  • Tumia muundo uliolokalishwa (kwa mfano, Feb 23, 2025)
  • Onyesha milisekunde

Kwa hili, tumia DATE_FORMAT() (badilisha datetime kuwa muundo wa maandishi wowote).

3.1 Sarufi ya msingi ya DATE_FORMAT()

DATE_FORMAT(datetime, 'format_string')

Mfano: Badilisha muda wa sasa kuwa YYYY/MM/DD HH:MM

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

Matokeo ya mfano:

2025/02/23 14:35

Vibambo vya muundo wa kawaida

SpecifierMeaningExample
%Y4-digit year2025
%m2-digit month02
%d2-digit day23
%HHour (24-hour)14
%iMinutes35
%sSeconds50
%fMicroseconds123456

Vidokezo

  • Baadhi ya vibambo hutofautiana kati ya herufi kubwa na ndogo.
  • %h ni muda wa saa 12, %H ni muda wa saa 24.

3.2 Mifano ya muundo wa kawaida (inayotumika mara kwa mara katika kazi halisi)

1. Imegawanywa kwa slash

SELECT DATE_FORMAT(NOW(), '%Y/%m/%d');

2. Iliyo na lugha ya eneo (Kiingereza)

SELECT DATE_FORMAT(NOW(), '%b %d, %Y');

3. Bila sekunde

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

Kukosea kwa kawaida

  • Kwa sababu inarudisha maandishi, huwezi kuitumia mahesabu ya nambari.
  • Kwa kulinganisha na utafutaji, unapaswa kutumia aina ya DATETIME asili.

3.3 Pata sehemu ya tarehe au muda pekee

Unaweza pia kupata sehemu huku ukihifadhi aina (badala ya kuibadilisha kuwa maandishi).

SELECT DATE(NOW());   -- date only (DATE type)
SELECT TIME(NOW());   -- time only (TIME type)
SELECT YEAR(NOW());   -- year only
SELECT MONTH(NOW());  -- month only
SELECT DAY(NOW());    -- day only

Matumizi yanayopendekezwa

GoalRecommended
Formatting for displayDATE_FORMAT
Calculation / comparisonDATE() / TIME()

3.4 Onyesha kwa microseconds

Unapohitaji logi za usahihi wa juu:

SELECT NOW(6);

Kwa muundo:

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

Vidokezo muhimu

  • Safu yako lazima iwe DATETIME(6) au TIMESTAMP(6), vinginevyo usahihi hautahifadhiwa.
  • Haipatikani katika matoleo ya MySQL ya kabla ya 5.6.4 (inategemea mazingira).

Makosa ya kawaida

  • Kutumia DATE_FORMAT() katika kifungu cha WHERE kunazuia matumizi ya faharasa. wp:list /wp:list

    • Mfano mbaya: WHERE DATE_FORMAT(created_at, '%Y-%m-%d') = '2025-02-23'
    • Inashauriwa: WHERE created_at >= '2025-02-23 00:00:00' AND created_at < '2025-02-24 00:00:00'
    • Kuhifadhi maandishi yaliyopangwa kwa kuonyesha moja kwa moja (huathiri utendaji wa utafutaji)

Muhtasari muhimu wa sehemu hii

  • Tumia DATE_FORMAT() kubadilisha muundo wa kuonyesha.
  • Kwa mahesabu/ukilinganisha, weka aina asili.
  • Ukihitaji microseconds, taja usahihi katika ufafanuzi wa safu.
  • Kutumia kazi katika vifungu vya WHERE kunaweza kusababisha matatizo ya utendaji.

4. Mahesabu ya datetime kwa kutumia muda wa sasa

In MySQL, ni kawaida kuhesabu vitu kama “Saa N baadaye,” “Siku N zilizopita,” au “siku N zilizopita” kulingana na wakati wa sasa.
Kesi ya kawaida zaidi katika dunia halisi ni “pata data kutoka saa 24 zilizopita.”

Msingi wa hisabati ya tarehe na wakati ni INTERVAL (sintaksia ya kuongeza/kupunguza vitengo vya muda).

4.1 Ongeza/punguza kwa INTERVAL

Pata baada ya saa 1

SELECT NOW() + INTERVAL 1 HOUR;

Pata siku 3 zilizopita

SELECT NOW() - INTERVAL 3 DAY;

Pata baada ya mwezi 1

SELECT NOW() + INTERVAL 1 MONTH;

Vitengo vya kawaida

UnitMeaning
SECONDSeconds
MINUTEMinutes
HOURHours
DAYDays
WEEKWeeks
MONTHMonths
YEARYears

Makosa ya kawaida

  • DAY katika INTERVAL 1 DAY inafanya kazi hata ikiwa imeandikwa kwa herufi ndogo, lakini unapaswa kuiboresha katika timu.
  • Mahesabu ya mwisho wa mwezi yanaweza kutofautiana na matarajio kwa sababu idadi ya siku hubadilika (kwa mfano, Jan 31 + 1 month).

4.2 Pata data kutoka saa 24 zilizopita (muundo wa kawaida zaidi)

SELECT *
FROM users
WHERE created_at >= NOW() - INTERVAL 1 DAY;

Maana

  • Inalenga “kutoka sasa hadi saa 24 zilizopita.”

Vidokezo

  • Ikiwa utatumia CURDATE(), msingi unakuwa “leo saa 00:00,” ambayo hubadilisha maana.

Mfano (data ya leo):

SELECT *
FROM users
WHERE created_at >= CURDATE();

Kuelewa tofauti ni muhimu

ExpressionMeaning
NOW() - INTERVAL 1 DAYPast 24 hours
CURDATE()Since today 00:00

4.3 Pata tofauti za siku kwa DATEDIFF()

SELECT DATEDIFF('2025-03-01', '2025-02-23');

Matokeo:

6
  • Kitengo ni “siku”
  • Sehemu ya wakati inapuuzwa

Vidokezo

  • Ishara hubadilika kulingana na mpangilio wa hoja.
  • Huwezi kuhesabu tofauti katika saa/dakika/sekunde.

4.4 Tumia TIMESTAMPDIFF() kwa saa/dakika/sekunde

SELECT TIMESTAMPDIFF(HOUR,
                     '2025-02-23 12:00:00',
                     '2025-02-23 18:30:00');

Matokeo:

6

Dakika

SELECT TIMESTAMPDIFF(MINUTE,
                     '2025-02-23 12:00:00',
                     '2025-02-23 12:30:00');

Sekunde

SELECT TIMESTAMPDIFF(SECOND,
                     '2025-02-23 12:00:00',
                     '2025-02-23 12:00:45');

Matumizi

  • Mahesabu ya muda wa kikao
  • Ukaguzi wa kumalizika muda
  • Maamuzi ya muda wa kusimamisha

4.5 Pata mwanzo wa mwezi / mwisho wa mwezi (kizuizi cha kawaida katika dunia halisi)

Pata siku ya kwanza ya mwezi huu:

SELECT DATE_FORMAT(NOW(), '%Y-%m-01');

Siku ya kwanza ya mwezi ujao:

SELECT DATE_FORMAT(NOW() + INTERVAL 1 MONTH, '%Y-%m-01');

Vidokezo

  • Mwisho wa mwezi si tarehe imara.
  • Kwa maswali ya safu, “>= mwanzo AND < siku ya kwanza ya mwezi ujao” ni salama.

Muhtasari wa makosa ya kawaida

  • Kutumia BETWEEN na thamani za tarehe pekee na kusahau muda
  • Kuzima indexes kwa kutumia DATE(created_at) katika masharti ya WHERE
  • Kujikuta kwenye tatizo la “siku ya 31” katika mahesabu ya mwezi
  • Kutofahamu tofauti kati ya NOW() na CURDATE()

Mambo muhimu kutoka sehemu hii

  • INTERVAL ni msingi wa hisabati ya tarehe na wakati.
  • Saa 24 zilizopita = NOW() - INTERVAL 1 DAY.
  • Siku = DATEDIFF() ; vitengo vidogo = TIMESTAMPDIFF().
  • Kuwa mwangalifu na masharti ya mwisho kwa mahesabu yanayotokana na mwezi.

5. Kwa maswali ya safu, hii ni salama zaidi kuliko BETWEEN

Wakati wa kufanya utafutaji wa safu ya tarehe katika MySQL, wanaoanza wengi hutumia BETWEEN. Hata hivyo, mara nyingi husababisha matokeo yasiyotakiwa ikiwa hautimii mipaka ya muda kwa usahihi, hivyo muundo salama unashauriwa katika kazi halisi.

5.1 Misingi ya BETWEEN na hatari yake

Swali la kawaida

SELECT *
FROM orders
WHERE order_date BETWEEN '2025-02-01' AND '2025-02-10';

Inaonekana sawa, lakini ndani yake ni sawa na:

WHERE order_date &gt;= '2025-02-01 00:00:00'
  AND order_date &lt;= '2025-02-10 00:00:00'

Hivyo haihusishi data baada ya 00:00 tarehe 10 Feb.


5.2 Muundo salama (unapendekezwa)

Muundo unaopendekezwa

SELECT *
FROM orders
WHERE order_date &gt;= '2025-02-01 00:00:00'
  AND order_date &lt;  '2025-02-11 00:00:00';

Vidokezo muhimu

  • Bainisha kikomo cha mwisho kama “chini ya siku ijayo saa 00:00”
  • Salama zaidi kuliko <= 23:59:59 (inasupporti mikrosekunde)

5.3 Njia sahihi ya kupata data ya leo

Mfano mbaya:

WHERE DATE(created_at) = CURDATE();

Matatizo:

  • Kutumia kazi kwenye safu inasitisha viashiria
  • Inaweza kusababisha ucheleweshaji mkubwa kwenye majedwali makubwa

Inapendekezwa:

WHERE created_at &gt;= CURDATE()
  AND created_at &lt;  CURDATE() + INTERVAL 1 DAY;

Hii inahakikisha:

  • Viashiria vinaweza kutumika
  • Utafutaji wa haraka
  • Hakuna matatizo ya mipaka

5.4 Mifumo salama kwa siku 7 zilizopita / siku 30 zilizopita

Siku 7 zilizopita

WHERE created_at &gt;= NOW() - INTERVAL 7 DAY;

Siku 30 zilizopita

WHERE created_at &gt;= NOW() - INTERVAL 30 DAY;

Vidokezo

  • CURDATE() - INTERVAL 7 DAY inategemea “leo 00:00”
  • NOW() - INTERVAL 7 DAY inategemea “saa ya sasa”
  • Chagua kulingana na mahitaji

5.5 Sheria kuu ya kuweka viashiria vikiwa na ufanisi

Mbaya:

WHERE DATE(created_at) = '2025-02-23';

Nzuri:

WHERE created_at &gt;= '2025-02-23 00:00:00'
  AND created_at &lt;  '2025-02-24 00:00:00';

Kwa nini:

  • Viashiria hufanya kazi kwenye “safu yenyewe”
  • Kutumia kazi kunazuia matumizi ya viashiria (uchunguzi kamili)

Muhtasari wa makosa ya kawaida

  • Kusahau kujumuisha muda katika kikomo cha mwisho katika BETWEEN
  • Kukosa mikrosekunde wakati wa kutumia 23:59:59
  • Kutumia DATE() katika masharti ya WHERE na kupunguza kasi ya maswali
  • Kuweka “sasa” vs “leo 00:00” bila ufafanuzi

Mambo muhimu ya kukumbuka kutoka sehemu hii

  • Maswali ya safu ni salama zaidi kwa >= start AND < end .
  • BETWEEN inahitaji usimamizi wa mipaka kwa umakini.
  • Ili viashiria viwe na ufanisi, usifungue safu katika kazi.
  • Chagua wazi kati ya mantiki inayotegemea NOW() na ile inayotegemea CURDATE().

6. DEFAULT CURRENT_TIMESTAMP na ON UPDATE (misingi ya muundo wa jedwali)

Katika muundo wa hifadhidata, ni kawaida kusimamia kiotomatiki created_at na updated_at.
Katika MySQL, CURRENT_TIMESTAMP hukuruhusu kuweka muda wa sasa kiotomatiki wakati wa kuingiza na kusasisha.

6.1 Kuweka kiotomatiki created_at (DEFAULT CURRENT_TIMESTAMP)

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Tabia:

INSERT INTO users (name) VALUES ('Alice');

→ Muda wa sasa unaingizwa kiotomatiki kwenye created_at.

Mambo muhimu

  • CURRENT_TIMESTAMP inaweza kutumika katika DEFAULT.
  • NOW() haiwezi kutumika moja kwa moja katika DEFAULT.

Kosa la kawaida

created_at DATETIME DEFAULT NOW();  -- error

Sababu:

  • Katika MySQL, kwa kawaida huwezi kuweka kazi kama DEFAULT (isipokuwa CURRENT_TIMESTAMP).

6.2 Sasisha kiotomatiki updated_at (ON UPDATE)

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
               ON UPDATE CURRENT_TIMESTAMP
);

Tabia:

UPDATE users SET name = 'Bob' WHERE id = 1;

updated_at husasishwa kiotomatiki kwa muda wa sasa.

Matumizi

  • Ufuatiliaji wa kuingia mwisho
  • Historia ya masasisho
  • Rekodi za ukaguzi

6.3 DATETIME vs TIMESTAMP (muhimu)

TypeRangeTime zone impact
DATETIMEYear 1000 to 9999No
TIMESTAMP1970 to 2038Yes

Tofauti muhimu

  • TIMESTAMP huhifadhiwa ndani ya UTC na hubadilishwa kwa eneo la kikao wakati wa kuonyesha.
  • DATETIME huhifadhi thamani halisi (hakuna ubadilishaji).

Miongozo

CaseRecommended type
Log managementTIMESTAMP
Future dates (after 2038)DATETIME
Fixed values not requiring TZ conversionDATETIME

6.4 CURRENT_TIMESTAMP inaweza pia kutumika na DATETIME

Katika MySQL 5.6 na baadaye, unaweza kuweka CURRENT_TIMESTAMP kama DEFAULT na ON UPDATE kwa safu za DATETIME pia.

created_at DATETIME DEFAULT CURRENT_TIMESTAMP

Vidokezo

  • Matoleo ya zamani ya MySQL yana vikwazo (inategemea mazingira).
  • Ikiwa unahitaji usahihi:
    DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6)
    

6.5 Ikiwa unataka kutumia NOW(): mbadala (trigger)

CREATE TRIGGER set_created_at
BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();

Matumizi

  • Mantiki ngumu ya thamani ya awali
  • Ugawaji wa alama ya wakati kulingana na hali

Vidokezo

  • Vichochezi ni vigumu kutafuta hitilafu.
  • Epuka isipokuwa ni lazima.

Makosa ya kawaida ya muundo

  • Kuongeza ON UPDATE kwa created_at na updated_at pamoja
  • Kuchanganya tabia ya DATETIME na TIMESTAMP
  • Kuweka maamuzi ya eneo la wakati baadaye

Mambo muhimu kutoka sehemu hii

  • Tumia CURRENT_TIMESTAMP kwa DEFAULT.
  • Tumia ON UPDATE CURRENT_TIMESTAMP kwa ufuatiliaji wa masasisho.
  • Chagua aina kulingana na tabia ya eneo la wakati na tatizo la 2038.
  • Ikiwa unahitaji usahihi, usisahau (6) .

7. Ubunifu wa eneo la wakati (hifadhi katika UTC, onyesha katika muda wa eneo)

Unaposhughulikia muda wa sasa, ubunifu mbaya wa eneo la wakati husababisha upotevu wa muda na ubadilishaji mara mbili.
Katika vitendo, chaguo salama zaidi ni “hifadhi katika UTC, geuza kwa muda wa eneo kwa ajili ya kuonyesha.”

MySQL timezone architecture storing timestamps in UTC and converting to local time (JST)

Figure: Usanifu wa msingi wa kuhifadhi UTC katika MySQL na kuonyesha muda wa eneo

7.1 Angalia eneo la wakati wa sasa

Kwanza, angalia eneo la wakati MySQL inayoendesha.

SELECT @@global.time_zone, @@session.time_zone;
  • @@global.time_zone → mpangilio wa jumla wa seva
  • @@session.time_zone → mpangilio wa muunganisho/kipindi cha sasa
  • Ikiwa inaonyesha SYSTEM, inategemea mpangilio wa OS

Masuala ya kawaida

  • Seva za uzalishaji na maendeleo zina maeneo tofauti ya wakati ya OS
  • Programu hubadilisha hadi UTC, na DB hubadilisha tena (ubadilishaji mara mbili)

7.2 Badilisha eneo la wakati kwa kila kipindi

SET time_zone = 'Asia/Tokyo';

au unganisha hadi UTC:

SET time_zone = '+00:00';

Vidokezo muhimu

  • Inarejesha hali yake wakati muunganisho unafungwa
  • Ikiwa unatumia uwanja wa muunganisho (connection pooling), angalia mipangilio ya programu yako

7.3 Kwa nini huhifadhi katika UTC (kanuni ya ulimwengu halisi)

Sera iliyopendekezwa

  1. Hifadhi data katika UTC
  2. Badilisha hadi eneo la wakati la mtumiaji wakati wa kuonyesha

Sababu:

  • Msaada rahisi wa kimataifa
  • Epuka masuala ya saa za kiangazi (DST)
  • Punguza athari wakati wa kuhamisha seva

Pata UTC:

SELECT UTC_TIMESTAMP();

7.4 Badilisha maeneo ya wakati kwa CONVERT_TZ()

Mfano: UTC → JST

SELECT CONVERT_TZ('2025-02-23 05:35:00', '+00:00', '+09:00');

Kutumia majina ya maeneo ya wakati:

SELECT CONVERT_TZ('2025-02-23 05:35:00', 'UTC', 'Asia/Tokyo');

Mfano wa ulimwengu halisi

SELECT CONVERT_TZ(created_at, 'UTC', 'Asia/Tokyo')
FROM users;

7.5 Kwa nini CONVERT_TZ() inarudisha NULL

Ikiwa inarudisha NULL, sababu za kawaida ni:

  • Jedwali la maeneo ya wakati la MySQL halijapakiwa
  • Jina la eneo la wakati lililotajwa halipo

Mfano wa upakiaji kwenye Linux:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Vidokezo

  • Katika uzalishaji, thibitisha ruhusa na kama upya unahitajika
  • Katika Docker, zoneinfo inaweza isijumuishwe kulingana na picha (image)

7.6 Badilisha eneo la wakati la jumla la seva

Faili la usanidi (my.cnf / my.ini):

[mysqld]
default_time_zone = '+00:00'

Thibitisha baada ya upya:

SELECT @@global.time_zone;

Muhimu

  • Kwa mabadiliko ya uzalishaji, thibitisha wigo wa athari
  • Kuwa mwangalifu na data iliyopo (mara nyingi mabadiliko yanahusisha tu kuonyesha)

Makosa ya kawaida

  • Kuhifadhi muda wa eneo badala ya UTC, kisha kuongeza usaidizi wa kimataifa baadaye
  • Ubadilishaji mara mbili kati ya programu na DB
  • Kubuni kwa DATETIME bila kuzingatia maeneo ya wakati
  • Mipangilio tofauti ya TZ kati ya majaribio na uzalishaji

Mambo muhimu kutoka sehemu hii

  • Hifadhi katika UTC na ubadilishe wakati wa kuonyesha.
  • Tumia UTC_TIMESTAMP() .
  • Unapotumia CONVERT_TZ() , thibitisha jedwali la TZ.
  • Daima zingatia tofauti za mazingira katika maeneo ya wakati.

8. Mifano ya vitendo unayoweza kutumia moja kwa moja

Hapa kuna mifano halisi ya SQL inayoonyesha jinsi ya kutumia muda wa sasa wa MySQL katika maendeleo/utendaji halisi.
Imeandikwa ili uweze kunakili na kubandika moja kwa moja.

8.1 Kiotomatiki weka muda wa sasa kwenye logi

Unda jedwali

CREATE TABLE system_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    level VARCHAR(50),
    message TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Weka log

INSERT INTO system_logs (level, message)
VALUES ('ERROR', 'Failed to connect to the DB');

Pointi muhimu

  • created_at huingizwa kiotomatiki
  • Hakuna haja ya kupitisha timestamp kutoka kwenye programu
  • Ubunifu muhimu kwa ukaguzi na uchunguzi wa matukio

Makosa ya kawaida

  • Kusimamia wakati katika programu na DB
  • Kutokubaliana kwa wakati kutokana na majira ya saa yasiyo sambamba

8.2 Sasisha muda wa kuingia mwisho

Ubunifu wa jedwali

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255),
    last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP
               ON UPDATE CURRENT_TIMESTAMP
);

Sasisha wakati wa kuingia

UPDATE users
SET last_login = NOW()
WHERE id = 1;

Vidokezo

  • ON UPDATE hufanyika tu wakati safu inabadilika
  • Baadhi ya tamko la UPDATE huenda lisibadilishe thamani na hivyo lisisasisha

8.3 Rekebisha muda wa kumbukumbu katika kazi za batch

Kwa michakato mirefu, ni salama zaidi kuweka muda wa kumbukumbu.

SET @base_time = NOW();

SELECT *
FROM orders
WHERE created_at &gt;= @base_time - INTERVAL 1 DAY;

Kwa nini

  • Muda haubadili katikati ya mchakato
  • Ulinganifu unahifadhiwa

8.4 Mkusanyiko kwa leo / jana / siku 7 zilizopita

Mauzo ya leo

SELECT SUM(amount)
FROM orders
WHERE created_at &gt;= CURDATE()
  AND created_at &lt;  CURDATE() + INTERVAL 1 DAY;

Mauzo ya jana

SELECT SUM(amount)
FROM orders
WHERE created_at &gt;= CURDATE() - INTERVAL 1 DAY
  AND created_at &lt;  CURDATE();

Siku 7 zilizopita

SELECT COUNT(*)
FROM users
WHERE created_at &gt;= NOW() - INTERVAL 7 DAY;

Muhimu

  • Usitumie kazi kwenye safu katika masharti ya WHERE
  • Andika masharti yanayowafanya faharasa ziweze kutumika

8.5 Ukaguzi wa kumalizika (vikao/tokeni)

SELECT *
FROM sessions
WHERE expires_at &gt; NOW();

Futa safu zilizomalizika

DELETE FROM sessions
WHERE expires_at &lt;= NOW();

Makosa ya kawaida

  • Kutumia CURDATE() na kupuuza muda
  • Kuhifadhi UTC lakini kulinganisha na NOW() ya eneo

8.6 Pata safu zitakazoisha ndani ya masaa N

SELECT *
FROM coupons
WHERE expires_at &lt;= NOW() + INTERVAL 1 HOUR;

Matumizi:

  • Arifa za kumalizika
  • Taarifa za kumalizika

Unachopaswa daima kukumbuka

  • Kuwa wazi ikiwa msingi wako ni “sasa” au “leo 00:00”
  • Andika masharti yanayofanya faharasa ziwe na ufanisi
  • Amua muundo wa majira ya saa mapema
  • Usichanganye NOW() na UTC_TIMESTAMP() bila sera wazi

Mambo muhimu kutoka sehemu hii

  • Kwa logi/ukaguzi/ufuatilia usasishaji, tumia CURRENT_TIMESTAMP
  • Kwa mkusanyiko, tumia muundo salama wa >= AND <
  • Kwa usimamizi wa vikao, linganisha na NOW()
  • Weka muda wa msingi ili kudumisha usindikaji kuwa thabiti

9. Maswali Yanayoulizwa Mara kwa Mara (FAQ)

Hapa kuna maswali ya kawaida kuhusu wakati wa sasa wa MySQL, hasa vizingiti vinavyojitokeza katika kazi halisi.

9.1 Ni tofauti gani kati ya NOW() na CURRENT_TIMESTAMP?

Hitimisho: maana ya thamani iliyorudishwa ni sawa.

SELECT NOW(), CURRENT_TIMESTAMP;

Zote mbili hurudisha tarehe na saa ya sasa.

Tofauti kuu ni matumizi ya kisintaksia

  • CURRENT_TIMESTAMP inaweza kutumika katika DEFAULT na ON UPDATE
  • NOW() haiwezi kutumika moja kwa moja katika DEFAULT

Vidokezo

  • Si tofauti ya aina
  • Unaweza kubainisha usahihi kwa hoja kama (6)

9.2 Je, unapaswa kutumia SYSDATE()?

SYSDATE() hurudisha wakati katika “muda wa tathmini.”

SELECT SYSDATE(), SLEEP(2), SYSDATE();

Thamani inaweza kubadilika hata ndani ya swali moja.

Wakati wa kuitumia

  • Unapohitaji kurekodi muda halisi wa wakati

Wakati wa kuuepuka

  • Uiga
  • Usindikaji wa miamala ambapo uthabiti ni muhimu

Katika hali nyingi, kutumia NOW() inatosha.

9.3 Kwa nini muda umebadilika?

Main causes:

  1. Mipangilio ya eneo la saa ya seva
  2. Mipangilio ya eneo la saa ya kikao
  3. Ubadilishaji mara mbili na programu
  4. Tabia ya ubadilishaji otomatiki ya aina ya TIMESTAMP

Check with:

SELECT @@global.time_zone, @@session.time_zone;

Ushauri

  • Hifadhi katika UTC kwa chaguo-msingi
  • Badilisha tu wakati wa kuonyesha
  • Unganisha sera kati ya programu na DB

9.4 CONVERT_TZ() returns NULL

Causes:

  • Jedwali la maeneo ya saa halijapakia
  • Jina la eneo la saa si sahihi

Fix:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Kuwa makini hasa katika mazingira ya Docker.

9.5 Range shifts with BETWEEN

Bad:

WHERE created_at BETWEEN '2025-02-01' AND '2025-02-10';

Safe:

WHERE created_at &gt;= '2025-02-01 00:00:00'
  AND created_at &lt;  '2025-02-11 00:00:00';

Reasons:

  • Tatizo la wakati wa mpaka wa mwisho
  • Uvuaji wa milisekunde ndogo
  • Ufanisi wa faharasa

9.6 How do you choose between DATETIME and TIMESTAMP?

  • Msaada wa kimataifa / usimamizi wa UTC → TIMESTAMP
  • Baada ya 2038 au tarehe zilizowekwa → DATETIME

Amua hili wakati wa usanifu.

9.7 Microseconds aren’t being stored

Cause:

  • Hakuna usahihi ulioainishwa katika ufafanuzi wa safu

Fix:

created_at DATETIME(6)

Key takeaways from this section

  • Anza na NOW() na CURRENT_TIMESTAMP
  • Kwa maswali ya safu, tumia >= AND <
  • Hifadhi ya UTC ni chaguo-msingi salama zaidi
  • Usisahau uteuzi wa aina na usahihi

10. Muhtasari

Makala hii imepanga njia za vitendo za kupata, kupanga, kuhesabu, na kudhibiti wakati wa sasa katika MySQL.
Hatimaye, hapa kuna misingi ya chini kabisa unayopaswa kujua ili kuwa salama.

10.1 Kupata wakati wa sasa (misingi)

  • Upatikanaji wa jumla → NOW()
  • DEFAULT ya jedwali / ufuatiliaji wa sasisho → CURRENT_TIMESTAMP
  • Tarehe pekee → CURDATE()
  • Saa pekee → CURTIME()
  • UTC → UTC_TIMESTAMP()
  • Usahihi wa juu → NOW(6)

Kanuni za jumla

  • Ikiwa huna uhakika, kutumia NOW() ni sawa katika hali nyingi.
  • Kwa usanifu wa skema, tumia CURRENT_TIMESTAMP .

10.2 Maswali ya safu: “>= AND <” ni kanuni ya dhahabu

Safe pattern:

WHERE created_at &gt;= 'START'
  AND created_at &lt;  'END'

Why:

  • Huzuia kukosa safu za mwisho
  • Inafanya kazi na milisekunde ndogo
  • Inabaki na faharasa zinazotumika

Mfano mbovu

WHERE DATE(created_at) = CURDATE();

Usifungue safu ndani ya kazi.

10.3 Misingi ya hesabu ya tarehe na saa

  • Ongeza/ondoa → INTERVAL
  • Tofauti za siku → DATEDIFF()
  • Tofauti za saa → TIMESTAMPDIFF()

Kumbuka kila wakati kama msingi wako ni “sasa” au “leo 00:00.”

10.4 Kanuni za usanifu wa eneo la saa

  • Hifadhi katika UTC
  • Badilisha wakati wa kuonyesha
  • Unganisha sera kati ya programu na DB

Check with:

SELECT @@global.time_zone, @@session.time_zone;

10.5 Mazoea bora ya usanifu wa jedwali

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
           ON UPDATE CURRENT_TIMESTAMP
  • Vifaa vya kawaida kwa ukaguzi/kurekodi/ufuataji wa sasisho
  • Ikiwa unahitaji usahihi, taja (6)

Vidokezo 4 muhimu zaidi katika dunia halisi

  1. Usielewe vibaya tofauti kati ya NOW() na CURRENT_TIMESTAMP
  2. Kwa maswali ya safu, tumia >= AND <
  3. Hifadhi katika UTC kwa chaguo-msingi
  4. Amua aina (DATETIME vs TIMESTAMP) wakati wa usanifu

Ushughulikiaji wa wakati wa sasa wa MySQL ni msingi kwa ukaguzi, muunganiko wa mauzo, usimamizi wa uthibitishaji/kikao, kazi za batch, na mengineyo.
Ikiwa utafuata kanuni katika makala hii, unaweza kuepuka matatizo mengi ya kawaida kama vile mviringo wa wakati, hitilafu za mipaka, na kupungua kwa utendaji.