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ą w DATETIME .
  • Ten wzór pozwala uniknąć lat przestępnych i innych obliczeń danych.
  • Działa, czy x to DATE , DATETIME lub TIMESTAMP .

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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow