Sök…


Nu()

Select Now();

Visar aktuellt datum och tid på servern.

Update `footable` set mydatefield = Now();

Detta kommer att uppdatera fältet mydatefield med aktuellt serverdatum och tid i serverens konfigurerade tidszon, t.ex.

'2016-07-21 12:00:00'

Datum aritmetik

NOW() + INTERVAL 1 DAY  -- This time tomorrow

CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago

Visa lagrade mysql-frågor som ställdes för 3 till 10 timmar sedan (från 180 till 600 minuter sedan):

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 |
| ...      |                     |            |
+----------+---------------------+------------+

MySQL manuella sidor för TIMESTAMPDIFF() .

Se upp Försök inte använda uttryck som CURDATE() + 1 för datum aritmetik i MySQL. De returnerar inte det du förväntar dig, särskilt om du är van vid Oracle-databasprodukten. Använd CURDATE() + INTERVAL 1 DAY istället.

Testar mot ett datumintervall

Även om det är mycket frestande att använda BETWEEN ... AND ... för ett datumintervall är det problematiskt. Istället undviker detta mönster de flesta problem:

WHERE x >= '2016-02-25'
  AND x  < '2016-02-25' + INTERVAL 5 DAY

fördelar:

  • BETWEEN är "inkluderande" och inkluderar därmed sista datum eller andra.
  • 23:59:59 är klumpig och fel om du har mikrosekundupplösning på DATETIME .
  • Detta mönster undviker att hantera skottår och andra beräkningar av data.
  • Det fungerar om x är DATE , DATETIME eller TIMESTAMP .

SYSDATE (), NU (), CURDATE ()

  SELECT SYSDATE();

Denna funktion returnerar aktuellt datum och tid som ett värde i 'YYYY-MM-DD HH:MM:SS' eller YYYYMMDDHHMMSS format, beroende på om funktionen används i en sträng eller numeriskt sammanhang. Det returnerar datum och tid i den aktuella tidszonen.

  SELECT NOW();

Denna funktion är en synonym för SYSDATE() .

  SELECT CURDATE();

Denna funktion returnerar det aktuella datumet utan någon tid som ett värde i 'YYYY-MM-DD' eller YYYYMMDD format, beroende på om funktionen används i en sträng eller numeriskt sammanhang. Det returnerar datumet i den aktuella tidszonen.

Extrahera datum från givet datum eller datumtiduttryck

SELECT DATE('2003-12-31 01:02:03');

Utgången kommer att vara:

2003-12-31

Använda ett index för en datum- och tidsuppslag

Många verkliga databastabeller har många rader med DATETIME eller TIMESTAMP spänner över mycket tid, inklusive år eller till och med decennier. Ofta är det nödvändigt att använda en WHERE klausul för att hämta en delmängd av den tidsperioden. Till exempel kanske vi vill hämta rader för datumet 1 september 2016 från en tabell.

Ett ineffektivt sätt att göra det är detta:

 WHERE DATE(x) = '2016-09-01'   /* slow! */

Det är ineffektivt eftersom det tillämpar en funktion - DATE() - för värdena i en kolumn. Det betyder att MySQL måste undersöka varje värde på x , och att ett index inte kan användas.

Ett bättre sätt att utföra operationen är detta

 WHERE x >= '2016-09-01'
   AND x <  '2016-09-01' + INTERVAL 1 DAY

Detta väljer ett antal värden på x ligger någonstans på den aktuella dagen, fram till men inte inkluderar (därmed < ) midnatt nästa dag.

Om tabellen har ett index i x kolumnen, kan databasservern utföra en avstandsskanning på indexet. Det betyder att den snabbt kan hitta det första relevanta värdet på x och sedan skanna indexet i tur och ordning tills det hittar det senaste relevanta värdet. En indexintervallskanning är mycket effektivare än den fullständiga tabellscanningen som krävs enligt DATE(x) = '2016-09-01 .

Frestas inte att använda detta, även om det ser mer effektivt ut.

  WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY  /*  wrong! */

Den har samma effektivitet som områdescanningen, men den kommer att välja rader med värden på x faller exakt vid midnatt den 2 september 2016, vilket inte är vad du vill ha.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow