MySQL
Operacje na dacie i godzinie
Szukaj…
Teraz()
Select Now();
Pokazuje bieżącą datę i godzinę serwera.
Update `footable` set mydatefield = Now();
Spowoduje to zaktualizowanie pola mydatefield
bieżącą datą i godziną serwera w skonfigurowanej strefie czasowej serwera, np
'2016-07-21 12:00:00'
Arytmetyka daty
NOW() + INTERVAL 1 DAY -- This time tomorrow
CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago
Pokaż zapisane w mysql pytania zadane 3 do 10 godzin temu (180 do 600 minut temu):
SELECT qId,askDate,minuteDiff
FROM
( SELECT qId,askDate,
TIMESTAMPDIFF(MINUTE,askDate,now()) as minuteDiff
FROM questions_mysql
) xDerived
WHERE minuteDiff BETWEEN 180 AND 600
ORDER BY qId DESC
LIMIT 50;
+----------+---------------------+------------+
| qId | askDate | minuteDiff |
+----------+---------------------+------------+
| 38546828 | 2016-07-23 22:06:50 | 182 |
| 38546733 | 2016-07-23 21:53:26 | 195 |
| 38546707 | 2016-07-23 21:48:46 | 200 |
| 38546687 | 2016-07-23 21:45:26 | 203 |
| ... | | |
+----------+---------------------+------------+
Strony podręcznika MySQL dla TIMESTAMPDIFF()
.
Uwaga : nie próbuj używać wyrażeń takich jak CURDATE() + 1
do arytmetyki dat w MySQL. Nie zwracają tego, czego oczekujesz, zwłaszcza jeśli jesteś przyzwyczajony do produktu bazodanowego Oracle. CURDATE() + INTERVAL 1 DAY
użyj CURDATE() + INTERVAL 1 DAY
.
Testowanie względem zakresu dat
Chociaż używanie BETWEEN
... AND
... dla zakresu dat jest bardzo kuszące, jest problematyczne. Zamiast tego ten wzór pozwala uniknąć większości problemów:
WHERE x >= '2016-02-25'
AND x < '2016-02-25' + INTERVAL 5 DAY
Zalety:
-
BETWEEN
jest „włącznie”, tym samym włączając datę końcową lub drugą. -
23:59:59
jest niezdarny i zły, jeśli masz rozdzielczość mikrosekundową wDATETIME
. - Ten wzór pozwala uniknąć lat przestępnych i innych obliczeń danych.
- Działa, czy
x
toDATE
,DATETIME
lubTIMESTAMP
.
SYSDATE (), NOW (), CURDATE ()
SELECT SYSDATE();
Ta funkcja zwraca bieżącą datę i godzinę jako wartość w 'YYYY-MM-DD HH:MM:SS'
lub YYYYMMDDHHMMSS
, w zależności od tego, czy funkcja jest używana w kontekście łańcuchowym czy liczbowym. Zwraca datę i godzinę w bieżącej strefie czasowej.
SELECT NOW();
Ta funkcja jest synonimem SYSDATE()
.
SELECT CURDATE();
Ta funkcja zwraca bieżącą datę, bez żadnej godziny, jako wartość w 'YYYY-MM-DD'
lub YYYYMMDD
, w zależności od tego, czy funkcja jest używana w kontekście łańcuchowym czy liczbowym. Zwraca datę w bieżącej strefie czasowej.
Wyodrębnij datę z podanej daty lub wyrażenia daty i godziny
SELECT DATE('2003-12-31 01:02:03');
Dane wyjściowe będą:
2003-12-31
Używanie indeksu do wyszukiwania daty i godziny
Wiele rzeczywistych tabel baz danych ma wiele wierszy z wartościami kolumn DATETIME
LUB TIMESTAMP
które zajmują dużo czasu, w tym lata, a nawet dekady. Często konieczne jest użycie klauzuli WHERE
, aby pobrać część podzbiorów tego przedziału czasowego. Na przykład możemy chcieć pobrać z tabeli wiersze dotyczące daty 1 września 2016 r.
Nieefektywnym sposobem na to jest:
WHERE DATE(x) = '2016-09-01' /* slow! */
Jest nieefektywny, ponieważ stosuje funkcję - DATE()
- do wartości kolumny. Oznacza to, że MySQL musi zbadać każdą wartość x
i nie można użyć indeksu.
Lepszym sposobem wykonania operacji jest to
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
Wybiera zakres wartości x
leżących gdziekolwiek w danym dniu, aż do, ale nie wliczając (stąd <
) północ następnego dnia.
Jeśli tabela ma indeks w kolumnie x
, serwer bazy danych może wykonać skanowanie zakresu indeksu. Oznacza to, że może szybko znaleźć pierwszą odpowiednią wartość x, a następnie skanować indeks sekwencyjnie, aż znajdzie ostatnią odpowiednią wartość. Skanowanie zakresu indeksu jest znacznie bardziej wydajne niż skanowanie pełnego stołu wymagane przez DATE(x) = '2016-09-01
.
Nie ulegaj pokusie korzystania z tego, nawet jeśli wygląda to bardziej wydajnie.
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
Ma taką samą wydajność jak skanowanie zakresu, ale wybierze wiersze o wartości x
przypadającej dokładnie o północy 2 września 2016 r., Co nie jest tym, czego chcesz.