Zoeken…


Nu()

Select Now();

Toont de huidige serverdatum en -tijd.

Update `footable` set mydatefield = Now();

Dit zal het veld mydatefield met de huidige serverdatum en -tijd in de geconfigureerde tijdzone van de server, bijv

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

Datum rekenen

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

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

Toon de opgeslagen MySQL-vragen die 3 tot 10 uur geleden zijn gesteld (180 tot 600 minuten geleden):

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-hulppagina's voor TIMESTAMPDIFF() .

Pas op Probeer geen uitdrukkingen zoals CURDATE() + 1 voor rekenkundige datum in MySQL. Ze geven niet terug wat u verwacht, vooral als u gewend bent aan het Oracle-databaseproduct. Gebruik in plaats daarvan CURDATE() + INTERVAL 1 DAY .

Testen tegen een datumbereik

Hoewel het erg verleidelijk is om BETWEEN ... AND ... voor een periode te gebruiken, is het problematisch. In plaats daarvan vermijdt dit patroon de meeste problemen:

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

voordelen:

  • BETWEEN is 'inclusief', inclusief de laatste datum of seconde.
  • 23:59:59 is onhandig en fout als je een microsecondenresolutie hebt op een DATETIME .
  • Dit patroon voorkomt het omgaan met schrikkeljaren en andere gegevensberekeningen.
  • Het werkt of x DATE , DATETIME of TIMESTAMP .

SYSDATE (), NOW (), CURDATE ()

  SELECT SYSDATE();

Deze functie retourneert de huidige datum en tijd als een waarde in 'YYYY-MM-DD HH:MM:SS' indeling 'YYYY-MM-DD HH:MM:SS' of YYYYMMDDHHMMSS , afhankelijk van of de functie wordt gebruikt in een string of numerieke context. Het retourneert de datum en tijd in de huidige tijdzone.

  SELECT NOW();

Deze functie is een synoniem voor SYSDATE() .

  SELECT CURDATE();

Deze functie retourneert de huidige datum, zonder enige tijd, als een waarde in de indeling 'YYYY-MM-DD' of YYYYMMDD , afhankelijk van het feit of de functie in een string of numerieke context wordt gebruikt. Het retourneert de datum in de huidige tijdzone.

Datum extraheren van gegeven datum of datum / tijd-expressie

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

De output zal zijn:

2003-12-31

Een index gebruiken voor het opzoeken van datum en tijd

Veel DATETIME -tabellen hebben veel rijen met DATETIME OF TIMESTAMP kolomwaarden die veel tijd omvatten, inclusief jaren of zelfs decennia. Vaak is het nodig om een WHERE component te gebruiken om een subset van die tijdspanne op te halen. We kunnen bijvoorbeeld rijen voor de datum 1-september-2016 uit een tabel ophalen.

Een inefficiënte manier om dit te doen is dit:

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

Het is inefficiënt omdat het een functie - DATE() - toepast op de waarden van een kolom. Dat betekent dat MySQL elke waarde van x moet onderzoeken en dat een index niet kan worden gebruikt.

Een betere manier om de operatie uit te voeren is dit

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

Hiermee selecteert u een bereik van x dat ergens op de betreffende dag ligt, tot maar niet (vandaar < ) middernacht op de volgende dag.

Als de tabel een index op de x kolom heeft, kan de databaseserver een bereikscan op de index uitvoeren. Dat betekent dat het snel de eerste relevante waarde van x kan vinden en vervolgens de index opeenvolgend kan scannen totdat het de laatste relevante waarde vindt. Een indexbereikscan is veel efficiënter dan de volledige tabelscan die vereist is op DATE(x) = '2016-09-01 .

Laat je niet verleiden om dit te gebruiken, ook al ziet het er efficiënter uit.

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

Het heeft dezelfde efficiëntie als de bereikscan, maar het zal rijen selecteren met waarden van x die precies om middernacht op 2-sept-2016 vallen, wat niet is wat u wilt.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow