2016-05-16 33 views
10

Sto cercando di ottenere la parte di data da un campo di data e ora. Ho usato questa query SQL:Perché la funzione CAST() restituisce la data errata?

select timestamp, CAST(timestamp as date) as date from messages 

ho ottenuto il seguente risultato:

-------------------------------------------- 
|  timestamp  |  date  | 
-------------------------------------------- 
| 2016-05-15 10:22:54 | 2016-05-16 | 
-------------------------------------------- 

Come indicato sopra, il campo della data prodotto rendimenti la data sbagliata 2016-05-16 mentre la data originale è 2016-05-15.

Come possiamo risolvere questo problema?

risposta

5

Utilizza la data non gettato, perché non è la fusione, ma un formato

select timestamp, date(timestamp) as my_date from messages 
+0

Grande risposta. Grazie ha funzionato come un fascino. Ma la funzione DATE_FORMAT() produce anche un formato errato. Perché? – user2899728

+2

Date() estrae la parte data di un datetime valido, Date_format cambia l'aspetto della data ... quale formato usi ...? – scaisEdge

+0

Ho usato '% d% M,% Y' – user2899728

0

Prova questa

select timestamp, cast(timestamp as date format 'yyyymmddhhmmss') as date from messages 
+0

Errore SQL ottenuto: # 1064 - Si è verificato un errore nella sintassi SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la sintassi corretta da usare vicino al 'formato' yyyymmddhhmmss ') come data dai messaggi LIMIT 0, 25' alla riga 1 – user2899728

5

vorrei suggerire di utilizzare la funzione DATE_FORMAT e non il CAST in quanto si sta formattando la data come

SELECT `timestamp`, DATE_FORMAT(`timestamp`, '%Y-%m-%d) as my_date from messages 

Nota inoltre che sia la funzione CAST che la funzione DATE chiamano internamente funzione _date_typecast quindi non c'è alcuna differenza tra loro.

7

Questo non è un problema !!! Ha impostato solo l'ora_zona sbagliata. vedere campione

ottenere time_zone corrente

SHOW GLOBAL VARIABLES LIKE 'time_zone'; -- systemwide setting 
SHOW VARIABLES LIKE 'time_zone'; -- session setting 

campione

MariaDB [mysql]> select t, CAST(t as date) FROM groupme LIMIT 1; 
+---------------------+-----------------+ 
| t     | CAST(t as date) | 
+---------------------+-----------------+ 
| 2016-05-15 20:22:54 | 2016-05-15  | 
+---------------------+-----------------+ 
1 row in set (0.00 sec) 

MariaDB [mysql]> SET time_zone ='-12:00'; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [mysql]> select t, CAST(t as date) FROM groupme LIMIT 1; 
+---------------------+-----------------+ 
| t     | CAST(t as date) | 
+---------------------+-----------------+ 
| 2016-05-14 20:22:54 | 2016-05-14  | 
+---------------------+-----------------+ 
1 row in set (0.00 sec) 

MariaDB [mysql]>