Mwongozo wa Tarehe na Muda wa MySQL: Aina za Data, Kazi, Uformatishaji, na Maswali ya Mipaka

目次

1. Utangulizi

MySQL ni mfumo wa usimamizi wa hifadhidata unaotumika sana kwa ujenzi wa programu za wavuti na hifadhidata, na kushughulikia data ya tarehe kwa usahihi ni muhimu hasa. Kwa mfano, data inayohusiana na tarehe inaonekana katika hali nyingi: kusimamia machapisho ya blogu, kufuatilia historia ya mauzo ya bidhaa, na kuhifadhi historia ya kuingia kwa watumiaji. Kwa kusimamia data ya tarehe kwa usahihi, unaweza kuchakata data kwa ufanisi na kutoa taarifa sahihi kwa watumiaji.

Katika mwongozo huu, tutaelezea kwa kina kila kitu kutoka aina za data za tarehe/nyakati za msingi na jinsi ya kutumia kazi za tarehe katika MySQL hadi mahesabu yanayotokana na tarehe na maswali ya safu. Maudhui haya yameundwa kwa watumiaji wa kiwango cha mwanzo hadi wa kati, na tutaongeza mifano ya maswali ya vitendo kulingana na matukio halisi—kufanya iwe ya manufaa kwa kazi ya kila siku.

Kwa kusoma makala hii, utaweza kufanya yafuatayo:

  • Kuelewa sifa za aina za data za tarehe/nyakati za MySQL na kuchagua aina inayofaa kwa data yako.
  • Kutumia kazi za tarehe ili kupata na kushughulikia kwa urahisi tarehe ya sasa, tarehe za zamani, na tarehe za baadaye.
  • Kuchukua data kwa vipindi maalum kwa kufanya utafutaji wa safu za tarehe na kulinganisha.

Sasa, hebu tazame misingi ya tarehe za MySQL kuanzia sehemu ijayo.

2. Muhtasari wa Aina za Data za Tarehe/Nyakati za MySQL

Unaposhughulikia tarehe katika MySQL, ni muhimu kuchagua aina sahihi ya data ya tarehe/nyakati kulingana na data na kesi ya matumizi. MySQL inatoa aina nyingi za data kwa kushughulikia tarehe na nyakati, kila moja ikiwa na sifa na matumizi tofauti. Katika sehemu hii, tuelezea aina kuu za tarehe/nyakati na matumizi yao ya kawaida kwa undani.

DATE

Aina ya DATE huhifadhi tu tarehe (mwaka, mwezi, siku) na haijumuishi kipengele cha wakati. Safu inayokubalika ni kutoka “1000-01-01” hadi “9999-12-31,” hivyo inaweza kushughulikia tarehe kutoka mwaka 1000 hadi 9999. Inafaa kwa taarifa za tarehe pekee ambapo wakati si muhimu, kama vile siku za kuzaliwa au kumbukumbu za miaka.

CREATE TABLE users (
    id INT,
    name VARCHAR(50),
    birth_date DATE
);

TIME

Aina ya TIME huhifadhi wakati (masaa, dakika, sekunde). Safu inayokubalika ni kutoka “-838:59:59” hadi “838:59:59.” Kwa kuwa inaweza kuwakilisha wakati hasi, inaweza pia kutumika kuonyesha tofauti za wakati. Inafaa kwa kurekodi masaa ya kazi au muda wa majukumu.

CREATE TABLE work_log (
    id INT,
    task_name VARCHAR(50),
    duration TIME
);

DATETIME

Aina ya DATETIME huhifadhi pamoja tarehe na wakati. Safu inayokubalika ni kutoka “1000-01-01 00:00:00” hadi “9999-12-31 23:59:59.” Haitegemei majira ya saa, na unaweza kupata thamani iliyohifadhiwa kama ilivyohifadhiwa. Inafaa kwa kurekodi alama za wakati za matukio ya zamani au ratiba za baadaye.

CREATE TABLE appointments (
    id INT,
    description VARCHAR(50),
    appointment_datetime DATETIME
);

TIMESTAMP

Aina ya TIMESTAMP huhifadhi tarehe na wakati na hubadilisha kiotomatiki thamani kulingana na majira ya saa ya seva. Safu inayokubalika ni kutoka “1970-01-01 00:00:01 UTC” hadi “2038-01-19 03:14:07 UTC.” Inalingana na wakati wa Unix epoch na inafaa kwa kurekodi alama za wakati na historia ya mabadiliko. Pia, kwa kuwa TIMESTAMP inaweza kuweka wakati wa sasa kwa chaguo-msingi, ni rahisi kwa kurekodi kiotomatiki muda wa uundaji na usasishaji.

CREATE TABLE posts (
    id INT,
    title VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

YEAR

Aina ya YEAR huhifadhi tu mwaka. Safu inayokubalika ni kutoka “1901” hadi “2155.” Inafaa wakati unataka kuwakilisha mwaka maalum, kama vile mwaka wa uzalishaji au mwaka wa kuanzishwa.

CREATE TABLE products (
    id INT,
    name VARCHAR(50),
    manufactured_year YEAR
);

Ulinganisho na Matumizi ya Kila Aina ya Tarehe/Nyakati

Data TypeStored ValueRangeTypical Use Cases
DATEYear, month, day1000-01-01 ~ 9999-12-31Birthdays, anniversaries, etc.
TIMEHour, minute, second-838:59:59 ~ 838:59:59Working time, task duration
DATETIMEYear, month, day, hour, minute, second1000-01-01 00:00:00 ~ 9999-12-31 23:59:59Schedules, event timestamps
TIMESTAMPYear, month, day, hour, minute, second1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTCCreated/updated times, automatic tracking
YEARYear1901 ~ 2155Manufacturing year, founding year

Muhtasari

MySQL date/time data types should be chosen based on the characteristics of your data and how you plan to use it. In the next section, we’ll take a closer look at the differences between DATETIME and TIMESTAMP, which are especially easy to confuse.

3. Tofauti Kati ya DATETIME na TIMESTAMP

When working with dates and times in MySQL, DATETIME and TIMESTAMP are commonly used, but there are important differences between them. Both store year, month, day, hour, minute, and second, but they differ in how they handle time zones and the time range they can store. You should choose based on your use case. In this section, we’ll explain the differences and characteristics of DATETIME and TIMESTAMP in detail.

Sifa za DATETIME

  • Haitegemei majira ya saa : The DATETIME type is not affected by the server time zone setting. You can retrieve the stored value exactly as saved.
  • Kiwango : It supports from 1000-01-01 00:00:00 to 9999-12-31 23:59:59.
  • Matumizi : Suitable for data you want to store without relying on any particular time zone, such as historical events or future schedules.

Mfano: Kuhifadhi tarehe/nyakati ya tukio

For example, if you want to keep a “universal” date/time value as‑as, DATETIME is a good choice. The following example records an event scheduled at a specific date and time.

CREATE TABLE events (
    id INT,
    event_name VARCHAR(50),
    event_datetime DATETIME
);

In this table, the date/time stored in event_datetime is not affected by time zones, and the value is retrieved exactly as stored.

Sifa za TIMESTAMP

  • Inategemea majira ya saa : The TIMESTAMP type is stored and retrieved based on the server time zone. When moving data between servers in different time zones, conversion will occur accordingly.
  • Kiwango : It supports from 1970-01-01 00:00:01 UTC to 2038-01-19 03:14:07 UTC (based on the Unix time range).
  • Msaada wa usasishaji otomatiki : Using DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP , MySQL can automatically record the current timestamp when inserting or updating data.
  • Matumizi : Best for automatically tracking creation or update time, such as when you want a timestamp to change whenever a record is updated.

Mfano: Kuhifadhi nyakati za kuundwa na kusasishwa kwa machapisho

This example uses the auto-update feature of TIMESTAMP to record creation and update times for blog posts.

CREATE TABLE blog_posts (
    id INT,
    title VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

With this setting, created_at is recorded when the post is first created, and updated_at is automatically updated every time the post is edited.

Jedwali la Ulinganisho: DATETIME vs TIMESTAMP

FeatureDATETIMETIMESTAMP
Time zoneNot dependent on server time zoneDependent on server time zone
Range1000-01-01 00:00:00 ~ 9999-12-31 23:59:591970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC
Auto-updateNoneSupported via DEFAULT CURRENT_TIMESTAMP, etc.
Typical use casesStore fixed date/time valuesAuto-track created/updated times

Jinsi ya Kuchagua

  • Chagua DATETIME ikiwa hutaki athari za majira ya saa : For example, if you want to store an event time as a fixed local time for a specific country/region, DATETIME can be appropriate.
  • Chagua TIMESTAMP ikiwa unahitaji usasishaji otomatiki au usimamizi wa majira ya saa : For example, if you want automatically record when database rows are updated, TIMESTAMP is convenient.

Muhtasari

DATETIME and TIMESTAMP have different characteristics. By choosing the right one for your purpose, you can manage date/time data more efficiently. In the next section, we’ll look at the essential date functions in MySQL.

4. Misingi ya Kazi za Tarehe/Nyakati za MySQL

MySQL provides many functions for working with dates and times—from retrieving the current date/time to adding or subtracting intervals. These functions are useful for database administration and analysis. In this section, we’ll explain the basics of MySQL date/time functions and their typical use cases.

Kazi za Kupata Tarehe/Nyakati ya Sasa

Tatu kawaida functions za kupata tarehe na wakati wa sasa katika MySQL ni NOW(), CURDATE(), na CURTIME().

NOW()

Tumia NOW() inarudisha tarehe na wakati wa sasa katika umbizo YYYY-MM-DD HH:MM:SS. Ni muhimu kwa kurekodi na kuweka alama ya wakati ya rekodi.

SELECT NOW(); -- Get the current date and time

CURDATE()

Tumia CURDATE() inarudisha tarehe ya sasa katika umbizo YYYY-MM-DD. Haijumuishi wakati, kwa hivyo ni inayofaa wakati unahitaji tarehe pekee.

SELECT CURDATE(); -- Get the current date

CURTIME()

Tumia CURTIME() inarudisha wakati wa sasa katika umbizo HH:MM:SS. Tumia wakati unahitaji wakati pekee bila tarehe.

SELECT CURTIME(); -- Get the current time

Functions za Kuongeza/Kutoa Tarehe

Ili kuongeza au kutoa vipindi kutoka kwa tarehe, tumia DATE_ADD() na DATE_SUB(). Functions hizi hufanya iwe rahisi kuhesabu tarehe za baadaye au za zamani.

DATE_ADD()

Tumia DATE_ADD() inaongeza kipindi kilichotajwa kwa tarehe. Kwa mfano, ni muhimu kwa kupata tarehe ya siku 7 baadaye au mwezi 1 baadaye.

SELECT DATE_ADD('2023-01-01', INTERVAL 7 DAY); -- Returns 2023-01-08

DATE_SUB()

Tumia DATE_SUB() inakatoa kipindi kilichotajwa kutoka kwa tarehe. Tumia ili kuhesabu tarehe za zamani.

SELECT DATE_SUB('2023-01-01', INTERVAL 1 MONTH); -- Returns 2022-12-01

Function ya Kuhesabu Tofauti za Tarehe

Ili kuhesabu tofauti kati ya tarehe mbili, DATEDIFF() ni rahisi. Kwa mfano, unaweza kuhesabu siku ngapi zimepita tangu tarehe maalum, au idadi ya siku kati ya tarehe mbili.

DATEDIFF()

Tumia DATEDIFF() inarudisha tofauti kati ya tarehe mbili kwa siku. Ni muhimu wakati unataka kuthibitisha idadi ya siku kutoka tarehe ya mwanzo hadi tarehe ya mwisho.

SELECT DATEDIFF('2023-01-10', '2023-01-01'); -- Returns 9

Functions Zingine Muhimu za Tarehe

MySQL hutoa functions za ziada zenye msaada.

EXTRACT()

Tumia EXTRACT() inachukua sehemu maalum (mwaka, mwezi, siku, n.k.) kutoka kwa tarehe. Ni muhimu wakati unahitaji sehemu tu ya tarehe.

SELECT EXTRACT(YEAR FROM '2023-01-01'); -- Extract year (2023)
SELECT EXTRACT(MONTH FROM '2023-01-01'); -- Extract month (1)
SELECT EXTRACT(DAY FROM '2023-01-01'); -- Extract day (1)

DATE_FORMAT()

Tumia DATE_FORMAT() inaonyesha tarehe katika umbizo lililotajwa. Ni muhimu wakati unataka kuonyesha tarehe katika umbizo maalum (kwa mfano, umbizo la Kijapani).

SELECT DATE_FORMAT('2023-01-01', '%Y-%m-%d'); -- Returns 2023-01-01

5. Mbinu za Uumbizaji na Ubadilishaji wa Tarehe

Katika MySQL, unaweza kubadilisha jinsi tarehe zinavyoonyeshwa kuwa umbizo linalosomwa rahisi zaidi, au kubadilisha mistari ya tarehe kuwa aina za tarehe. Hii inakuruhusu kudhibiti umbizo la kuonyesha kwa urahisi na kusimamia data kwa uthabiti hata wakati pembejeo zinakuja katika umbizo tofauti. Katika sehemu hii, tutaeleza functions kuu zinazotumiwa kwa uumbizaji na ubadilishaji wa tarehe.

Uumbizaji wa Tarehe kwa Tumia Function ya DATE_FORMAT()

Kwa kutumia DATE_FORMAT(), unaweza kuonyesha thamani za tarehe katika umbizo lililotajwa. Hii ni muhimu hasa wakati unahitaji umbizo la kuonyesha lililo tofauti na la kawaida, kama umbizo la Kijapani “YYYY年MM月DD日”.

Chaguzi za Umbizo

Kwa DATE_FORMAT(), unaweza kutumia chaguzi za umbizo kama ifuatavyo:

  • %Y : mwaka wa tarakimu nne
  • %y : mwaka wa tarakimu mbili
  • %m : mwezi wa tarakimu mbili (01–12)
  • %d : siku ya tarakimu mbili (01–31)
  • %H : saa ya tarakimu mbili (00–23)
  • %i : dakika ya tarakimu mbili (00–59)
  • %s : sekunde ya tarakimu mbili (00–59)

Matumizi ya Mfano

Kwa mfano, ili kuonyesha tarehe 2023-01-01 kama “2023年01月01日,” unaweza kuandika ifuatavyo:

SELECT DATE_FORMAT('2023-01-01', '%Y年%m月%d日'); -- Returns 2023年01月01日

Unaweza pia kuonyesha tarehe na wakati kwa slash, kama “2023/01/01 12:30:45.”

SELECT DATE_FORMAT('2023-01-01 12:30:45', '%Y/%m/%d %H:%i:%s'); -- Returns 2023/01/01 12:30:45

Kubadilisha Mstari kuwa Tarehe kwa STR_TO_DATE()

STR_TO_DATE() hutumia kubadilisha mstari wa tarehe kuwa aina ya tarehe ya MySQL. Kwa mfano, ni muhimu unapohitaji kutendea mstari kama “2023年01月01日” kama thamani ya DATE.

Mfano wa Matumizi

Kubadilisha mstari “2023-01-01” kuwa thamani ya DATE, andika yafuatayo:

SELECT STR_TO_DATE('2023-01-01', '%Y-%m-%d'); -- Returns 2023-01-01 as a DATE

Kubadilisha mstari wa mtindo wa Kijapani kama “2023年01月01日” kuwa tarehe, eleza muundo unaofaa:

SELECT STR_TO_DATE('2023年01月01日', '%Y年%m月%d日'); -- Returns 2023-01-01 as a DATE

Mifano ya Kubadilisha Tarehe kutoka Miundo Mbalimbali

Katika matumizi halisi, miundo ya ingizo la tarehe inaweza kutofautiana, hivyo unaweza kuhitaji kubadilisha kutoka miundo tofauti. Hapa chini kuna mifano michache.

  1. Badilisha “YYYY/MM/DD” kuwa thamani ya DATE
    SELECT STR_TO_DATE('2023/01/01', '%Y/%m/%d'); -- Returns 2023-01-01 as a DATE
    
  1. Badilisha “MM-DD-YYYY” kuwa thamani ya DATE
    SELECT STR_TO_DATE('01-01-2023', '%m-%d-%Y'); -- Returns 2023-01-01 as a DATE
    

Kwa njia hii, hata kama data imeingizwa katika miundo tofauti, unaweza kuihifadhi na kuisimamia kwa uthabiti katika muundo mmoja wa tarehe.

Tofauti Kati ya DATE_FORMAT na STR_TO_DATE, na Wakati wa Kutumia Kila Moja

  • DATE_FORMAT() : Inatumika kubadilisha muundo wa kuonyesha wa thamani za tarehe zilizopo. Kwa kuwa mabadiliko haya huathiri tu muonekano, data iliyohifadhiwa haibadiliki.
  • STR_TO_DATE() : Inatumika kubadilisha mstari wa tarehe kuwa thamani ya MySQL DATE au DATETIME. Hii hubadilisha aina ya data iliyohifadhiwa na kurahisisha usindikaji wa tarehe kwa kutumia kazi na maswali mengine ya MySQL.

Muhtasari

Kwa kutumia DATE_FORMAT() na STR_TO_DATE(), unaweza kusimamia kwa ubunifu jinsi data ya tarehe inavyoonyeshwa na kuhifadhiwa. Hii inafanya iwezekanike kushughulikia ingizo la mtumiaji au mfumo kwa ubunifu zaidi huku ukidumisha usimamizi thabiti wa tarehe. Katika sehemu ijayo, tutaelezea mahesabu ya tarehe na kulinganisha, na kuchunguza kwa undani jinsi ya kuhesabu na kulinganisha vipindi kwa kutumia data ya tarehe.

6. Mahesabu ya Tarehe na Ulinganishaji

MySQL hutoa kazi kadhaa za urahisi kwa ajili ya mahesabu ya tarehe na kulinganisha. Hizi huruhusu kutoa data kwa vipindi maalum au kuhesabu tofauti za tarehe kwa uchambuzi. Katika sehemu hii, tutatangaza kazi kuu zinazotumika kwa mahesabu ya tarehe na kulinganisha, pamoja na jinsi ya kuzitumia.

Kazi ya Kuhesabu Tofauti za Tarehe: DATEDIFF()

Kazi DATEDIFF() inarudisha tofauti kati ya tarehe mbili katika “siku”. Ni muhimu unapohitaji kuangalia siku zilizopita kati ya tarehe au kujua ni siku ngapi zimepita kutoka tukio la zamani hadi leo.

Mfano wa Matumizi

Kwa mfano, kuhesabu idadi ya siku kutoka Januari 1, 2023 hadi Januari 10, 2023, andika yafuatayo:

SELECT DATEDIFF('2023-01-10', '2023-01-01'); -- Returns 9

Katika mfano huu, tofauti kutoka tarehe ya kuanza hadi tarehe ya kumaliza ni siku 9, hivyo matokeo ni 9.

Kuhesabu Tofauti kwa Kitengo kwa TIMESTAMPDIFF()

Kazi TIMESTAMPDIFF() inahesabu tofauti kati ya tarehe mbili au tarehe na saa katika kitengo kilichobainishwa (mwaka, mwezi, siku, saa, dakika, sekunde). Kwa mfano, unaweza kuhesabu tofauti katika “miezi” au “saa” kulingana na mahitaji.

Mfano wa Matumizi

  1. Hesabu tofauti katika miezi
    SELECT TIMESTAMPDIFF(MONTH, '2022-01-01', '2023-01-01'); -- Returns 12
    
  1. Hesabu tofauti katika saa
    SELECT TIMESTAMPDIFF(HOUR, '2023-01-01 00:00:00', '2023-01-02 12:00:00'); -- Returns 36
    

Kulinganisha Tarehe

Ulinganishaji wa tarehe unafanywa kwa kutumia opereta za kulinganisha za kawaida za MySQL (<, >, <=, >=, =). Hii inakuwezesha kutoa data ndani ya kipindi maalum au kujumuisha tarehe za zamani/badaye kama masharti.

Mfano wa Matumizi

Kwa mfano, kutoa data “siku ya au baada ya Januari 1, 2023”, andika yafuatayo:

SELECT * FROM events WHERE event_date >= '2023-01-01';

Kuweka Kiwango kwa BETWEEN

The BETWEEN operator hukuruhusu kubainisha safu ya tarehe ili kupata data. Ni muhimu unapohitaji kutoa rekodi ambazo ziko ndani ya kipindi maalum.

Example Usage

Kwa mfano, ili kupata data kutoka Januari 1, 2023 hadi Januari 31, 2023, andika yafuatayo:

SELECT * FROM events WHERE event_date BETWEEN '2023-01-01' AND '2023-01-31';

Mahesabu ya Tarehe kwa kutumia ADDDATE() na SUBDATE()

Unaweza kutumia ADDDATE() na SUBDATE() kuongeza au kupunguza idadi ya siku kutoka tarehe. Hizi ni rahisi kwa kuhesabu tarehe za baadaye au za zamani.

Example Usage

  1. Ongeza siku 10 kwa tarehe
    SELECT ADDDATE('2023-01-01', 10); -- Returns 2023-01-11
    
  1. Punguza siku 10 kutoka tarehe
    SELECT SUBDATE('2023-01-01', 10); -- Returns 2022-12-22
    

Muhtasari

Kwa kutumia vipengele vya mahesabu na kulinganisha tarehe vya MySQL, unaweza kutoa data kwa ufanisi kwa kipindi maalum na kuchambua data kwa safu za muda. Katika sehemu ijayo, tutachunguza kwa undani mada ya hali ya juu ya “utafuta wa safu ya tarehe.”