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ó';