2013-01-21 3 views
1

J'ai le tableau ci-dessous:comportement étrange de requête

+-------------+------------------+------+-----+-------------------+----------------+ 
| Field  | Type    | Null | Key | Default   | Extra   | 
+-------------+------------------+------+-----+-------------------+----------------+ 
| category_id | int(11) unsigned | NO | PRI | NULL    | auto_increment | 
| title  | varchar(64)  | NO |  | NULL    |    | 
| description | text    | NO |  | NULL    |    | 
| created_on | timestamp  | NO |  | CURRENT_TIMESTAMP |    | 
| updated_on | timestamp  | YES |  | NULL    |    | 
+-------------+------------------+------+-----+-------------------+----------------+ 

je devais supprimer des enregistrements en fonction de la date de création et exécuté un ensemble de requêtes:

mysql> select created_on from categories limit 10; 
+---------------------+ 
| created_on   | 
+---------------------+ 
| 2013-01-14 09:26:21 | 
| 2012-08-15 11:18:38 | 
| 2012-09-06 06:44:46 | 
| 2012-09-06 23:27:14 | 

puis

mysql> select date('2013-01-14 09:26:21'); 
+-----------------------------+ 
| date('2013-01-14 09:26:21') | 
+-----------------------------+ 
| 2013-01-14     | 
+-----------------------------+ 

et finalement j'ai obtenu:

mysql> select DATE('created_on') from categories limit 10; 
+--------------------+ 
| DATE('created_on') | 
+--------------------+ 
| NULL    | 
| NULL    | 
| NULL    | 
| NULL    | 

Comme vous pouvez le voir, la date n'a pas été convertie correctement. En environ 10 minutes est travaillé ok:

mysql> select date(created_on) from categories limit 10; 
+------------------+ 
| date(created_on) | 
+------------------+ 
| 2013-01-14  | 
| 2012-08-15  | 
| 2012-09-06  | 
| 2012-09-06  | 

Je suis sûr que les données étaient intactes pendant que j'exécutais les requêtes.

Donc ma question:
Quelqu'un peut-il expliquer pourquoi la fonction date a montré des résultats différents sur la même entrée?

+1

l'entrée n'a pas été le même. une fois, vous lui avez dit de lancer le texte 'created_on' dans un champ de date; résultant en Null pour chaque enregistrement car il ne pouvait pas le faire. L'autre fois, vous lui avez demandé d'utiliser un champ d'horodatage et de renvoyer la partie date. – xQbert

Répondre

3

Vous devez utiliser ::

select DATE(created_on) from categories limit 10; 

En utilisant la virgule inversée, vous demandez à la base de données pour traiter 'created_on' comme paramètre, et comme il ne peut pas être converti en type de date, vous obtenez null

+1

merci, j'ai pu voir ce qui ne va pas avec votre montage par moi-même :) – AlecTMH

3
select DATE('created_on') from categories limit 10; 

chaîne par rapport à la colonne:

select DATE(created_on) from categories limit 10; 
+0

merci, j'ai raté ça. – AlecTMH