cikk mysql

A minap az azonos fórum MySQL, olvastam a kérdést, hogy az érdekelt engem, és vezetett az írás ezt a cikket. A kérdés az volt, hogyan kell tartani az elmozdulás a dátumot és a megfelelő időben, hogy összefoglalja azt egy bizonyos időpontban. Próbáljuk megvitatni ezt a témát.

Beépített képességek MySQL.

A dokumentáció MySQL van egy jó néhány funkció dolgozni dátumát és időpontját. Tekintsük a lehetőségeket az átalakulás. Része lehetőségek léteznek MySQL sokáig, és néhány megjelent változat 4.1.1 és 5.0.1.

Minden beépített funkciókat az átalakulás időpontját, nem működnek a hiányos időpontokat, amikor a havi vagy a nulladik napon, és visszatérési értéke NULL. Részleges időpontok a következők:

A funkció a dátum - DATE_ADD () és DATE_SUB () - lehetővé teszi, hogy adjunk az eredeti dátumot és kivonni belőle az időintervallumok különböző időben egységek éves, negyedek, hónap, hét, nap, óra, perc, másodperc, és ezek valamilyen kombinációja. A funkció, megadhat egyetlen intervallum. A természetes okok miatt egyikük sem kombinációi év, negyedév, hónap, hét napig és a kisebb egységek.

Egy kicsit rugalmasabb kiszámításához napja elmozdulás, ha használja a számtani időközönként:

dátum + IDŐKÖZ expr egység
dátum - Interval expr egység

Ez a forma lehetővé teszi, hogy építeni összetett kifejezések. Például:

MOST # 40; # 41; - Interval 1 hónap + ütem 3 HOUR

Amikor dolgozik időközönként hónapok és negyedek kell arra, hogy a következő hónapokban a különböző napok számát a számítás lehetséges „kerekítés” a hónap utolsó napján a hónap eredményei:

Mégis meg kell említeni, hogy az összetett kifejezések fontos műveletek sorrendje - aritmetikai összegzése a szabályok nem érvényesek itt. Például, a következő parancsokat más eredményt:

Egy nagyon hasznos funkció, amely kiszámítja az utolsó nap a hónapban. Feature bevezetett változat 4.1.1. Ez lehetővé teszi, hogy ne csak az utolsó nap a hónap a megadott időpontban, hanem számítani az első napon:

LAST_DAY # 40; MOST # 40; # 41; # 41; + INTERVAL 1 NAP - Interval 1 hónap

Vedd több IDŐKÖZ néz nehézkes. Ha úgy tűnik, az SQL-kimutatás egyszer - nem szörnyű, de ha meg kell használni egy ilyen kifejezést a nyilatkozatban többször, akkor könnyen összezavarodnak.

Fix és bővíteni magukat.

Próbáljuk, hogy saját funkcióit, hogy a dolgokat, hogy nem kényelmes, vagy kényelmetlen, hogy írjon a beépített funkciókat.

Az első nap a hónapban.

A szabványos programozási vétel - eltávolítására nehézkes és gyakran ismételt kifejezése a funkciót.

CREATE FUNCTION BEGIN_OF_MONTH # 40;
p_date DATE
# 41;
RETURNS DATE
determinisztikus
TARTALMAZ SQL
SQL SECURITY Invoker
VISSZA LAST_DAY # 40; p_date # 41; + INTERVAL 1 NAP - Interval 1 hónap;

Úgy tűnik, mintha ez lett könnyebb, kompaktabb és könnyebb megérteni:

Őszintén szólva nem értem, hogy miért vágták LAST_DAY_OF_MONTH () a LAST_DAY () - ez nem nyilvánvaló. Még azt is nevezni END_OF_MONTH () - érthető, és nem sokáig.

CREATE FUNCTION END_OF_MONTH # 40;
p_date DATE
# 41;
RETURNS DATE
determinisztikus
TARTALMAZ SQL
SQL SECURITY Invoker
VISSZA LAST_DAY # 40; p_date # 41; ;

Az első és utolsó nap az évben, negyedév, vagy hetente.

Beépített funkciók lehetővé teszik számunkra, hogy meghatározzuk, hogy nem. Ezért mi magunk.

CREATE FUNCTION BEGIN_OF_YEAR # 40;
p_date DATE
# 41;
RETURNS DATE
determinisztikus
TARTALMAZ SQL
SQL SECURITY Invoker
VISSZA MAKEDATE # 40; ÉV # 40; p_date # 41;. 1 # 41; ;

CREATE FUNCTION END_OF_YEAR # 40;
p_date DATE
# 41;
RETURNS DATE
determinisztikus
TARTALMAZ SQL
SQL SECURITY Invoker
VISSZA MAKEDATE # 40; ÉV # 40; p_date # 41; 1 + 1 # 41; - Interval 1 NAP;

CREATE FUNCTION BEGIN_OF_WEEK # 40;
p_date DATE
# 41;
RETURNS DATE
determinisztikus
TARTALMAZ SQL
SQL SECURITY Invoker
RETURN p_date - Interval WEEKDAY # 40; p_date # 41; DAY;

END_OF_WEEK () függvény. BEGIN_OF_QUARTER () és END_OF_QUARTER () nem festett - Nem nehéz kitalálni, mit néznek. funkciók kód megtalálható a mellékletben a cikket.

Az összegezés hiányos dátumokat.

Bár a beépített funkciók és nem engedik működni hiányos dátumok, MySQL segítségével tárolhatja azokat egy adatbázisban. Miután hiányos időpontban, bizonyos értelemben - az intervallum. Írjunk egy függvény összegzési teljes dátumot hiányos.

CREATE FUNCTION DATE_ADD_OFFSET # 40;
p_date DATETIME.
p_offset DATETIME
# 41;
RETURNS DATETIME
determinisztikus
TARTALMAZ SQL
SQL SECURITY Invoker
VISSZA p_date
+ IDŐKÖZ ÉV # 40; p_offset # 41; ÉV
+ IDŐKÖZ HÓNAP # 40; p_offset # 41; HÓNAP
+ IDŐKÖZ DAY # 40; p_offset # 41; DAY
+ IDŐKÖZ MAKETIME # 40;
ÓRA # 40; p_offset # 41;.
MINUTE # 40; p_offset # 41;.
MÁSODIK # 40; p_offset # 41;
# 41; HOUR_SECOND;

Hasonlóan néz ki, inverz funkció - DATE_SUB_OFFSET ().

Átalakítás DATE DATETIME hiányos halad hiba nélkül.

CREATE FUNCTION DATE_TO_DATETIME # 40;
p_date DATE
# 41;
RETURNS DATETIME
determinisztikus
TARTALMAZ SQL
SQL SECURITY Invoker
VISSZA p_date;

Lehetetlen összefoglalni: DATE TIME vagy számot.

Kiderült valami obszcén: mindkét operandus valós számok, és kertelés nélkül foglalta össze:

Tudni, hogy a dátum a hét napját.

Ismerje hétköznap dátum egyszerű - a beépített WEEKDAY () függvény. A másik dolog, hogy tudja melyik dátum esik pénteken a második hét utolsó szombatján a hónap.

Kód FIND_WEEK_DAY () függvény a függelékben található. Az első lehetőség - dátum (hónap jelzik), a második - a hetek számát, és a harmadik - a nap a héten (az azonos számozása napon a WEEKDAY ()). Check it.

A pozitív érték a hét használják keresni a hónap elején, és nem korlátozza a hónap - akár meg is találja a tizenharmadik vasárnap a nyár.

A negatív érték a hét használják névlekérdezési a végén ebben a hónapban, és szintén nem korlátozódik egy hónap.

A nulla hét használják keresni a következő kívánt nap a hét egy meghatározott időpontban.

Volt még egy ötlet, hogy a fordított keresési azon a napon, de a keze nem érte el.

Több átalakítása egy funkció.

Hogyan lehet több konverziós dátum és idő, nem egy város egy halom számítástechnikai?

Úgy tűnik, meg kell írni ezt a rakás számítások és írási funkció kotoroya hogy megértsék, mit akarunk tőle, és elvégezni ezt a rakás számításokat.

Mégis rugalmasság megfontolások az olvashatóságot és teljesítményének válasszuk független funkcionális részek a DATE_RANGE () és DATE_ADD_INTERVAL (). és feldolgozzuk a szekvencia szabályok életbe DATE_TRANSFORM (). A kód az összetettségére, nem hoz - lásd a függelékben.

Mert DATE_TRANSFORM () formátumban átalakítási szabályok:

Szabályok vannak írva Elválasztás nélkül, és szekvenciálisan hajtjuk végre.

A jobb megértés számos példát.

Az első nap a következő hónapra. Számítjuk a következő hónapban, az első napon a hónap:

Kilenc reggel a harmadik napon a második hónap az előző negyedévhez képest. Képzeljük csak el, hogyan nézne ez a képlet segítségével az intervallumot és beépített funkciókat! Mindannyian sokkal egyszerűbb:

SQL-szkript ebben a cikkben.


  • A funkció beállítása az elején és végén a tartományban.
  • Az elején és a végén az intervallum típusú DATETIME - funkció DATE_RANGE ().
  • Keresés a hét napja - FIND_WEEK_DAY () függvényt.
  • Rövidített módja intervallum aritmetika - DATE_ADD_INTERVAL () függvényt.
  • Kifinomult típusú konverziós DATETIME - DATE_TRANSFORM () függvény.


Kérdések a cikket, és adatbázisok kérje fórumunkon - „Boldog Y”.

Néhány hasznos hibakereső lekérdezések.

A kényelem, a hibakeresés, ajánlom a pár sornyi kódot.

Jeleníti meg az összes funkciót a «teszt» a rendszer:

SELECT ROUTINE_NAME
AZ INFORMATION_SCHEMA.ROUTINES
AHOL ROUTINE_SCHEMA = „teszt”
ÉS ROUTINE_TYPE = 'funkció';

Állít elő, hogy távolítsa el az összes funkciót a «teszt» a rendszer:

SELECT GROUP_CONCAT # 40; CONCAT # 40; 'Drop'. ROUTINE_NAME. ';' # 41; SZEPARÁTOR ' # 41;
AZ INFORMATION_SCHEMA.ROUTINES
AHOL ROUTINE_SCHEMA = „teszt”
ÉS ROUTINE_TYPE = 'funkció';

Kapcsolódó cikkek