sql >> Databáze >  >> RDS >> Mysql

Navrhování nepřekrývajících se událostí data a času

Při práci s rozsahy data a času je velmi běžné, že používáte rozsah, který je na začátku zahrnující a na konci exkluzivní. Například:

(using ISO8601 formatting)

Start                  End
2013-04-29T01:00:00Z - 2013-04-29T02:00:00Z
2013-04-29T02:00:00Z - 2013-04-29T03:00:00Z

Hodnota je v rozsahu, když je menší nebo rovna začátku a větší než (ale ne rovna) konci. Ve výše uvedeném příkladu 02:00 patří do druhého rozsahu, nikoli do prvního. Jinými slovy:

Start <= value < End 

Nebo ekvivalentně,

Start <= value  AND  End > value

V matematice pomocí intervalové notace , toto je známé jako „polootevřený“ interval.

[Start, End)

Toto je vždy lepší přístup než myšlenka použít hodnotu jako 01:59:59 . Zvažte, zda bych měl odečíst End - Start získat trvání. Očekával bych, že odpověď bude jednu hodinu, nikoli 59 minut a 59 sekund.

Většina příkladů používá výrazy Start/End , ale někdy uvidíte Start/End nebo Start/Stop . Osobně si myslím, že nejlepší soubor termínů, který lze použít, když máte inkluzivní/exkluzivní rozsah, je Start/Until . Má další výhodu v tom, že oba výrazy mají 5 znaků, seřazují se abecedně a výslovně uvádějí, že datum ukončení je exkluzivní.

Také, když mluvíte o odlišných událostech, měli byste zaznamenávat své časy jako UTC, abyste předešli zmatkům ohledně časových pásem. To je dokonce důležité pro místní aplikace, protože mnoho časových pásem prochází přechodem na letní čas. Nechcete, aby hodnoty, které zaznamenáte do databáze, byly nejednoznačné. V MySQL můžete použít TIMESTAMP datový typ, abyste se ujistili, že hodnoty jsou uloženy jako UTC, nebo můžete použít DATETIME datový typ, pokud si můžete být jisti, že v kódu aplikace pracujete s hodnotami UTC.




  1. Jak mohu odečíst pomocí SQL v MYSQL mezi dvěma hodnotami data a času a získat výsledek v minutách nebo sekundách?

  2. Jak NVL() funguje v MariaDB

  3. Přidejte sloupec s výchozí hodnotou do existující tabulky na SQL Server

  4. mysql order by rand() výkonnostní problém a řešení