2010-07-13 2 views
4

J'ai une application de source fermée qui met un horodatage de 13 caractères dans une base de données MySQL. Une valeur est par exemple:Instruction SQL pour un horodatage de 13 caractères

1277953190942 

Maintenant, j'ai le problème, que je dois écrire une instruction SQL qui me retourner tous les résultats d'une table qui correspondent à une journée spéciale.

J'ai donc par exemple 01. Juillet 2010 et j'obtiendrai toutes les lignes où l'heure est entre 01. Juillet 2010 00:00:00 jusqu'au 01. Juillet 23:59:59.

Comment dois-je écrire cette instruction sql?

select * from myTable where TIMESTAMP = ??? 

Est-ce que quelqu'un le sait?

Cordialement.

Répondre

7

C'est un Unix timestamp avec une précision milliseconde, à savoir le nombre de millisecondes depuis Unix epoch. D'où la déclaration correcte serait

select * from myTable where DATE(FROM_UNIXTIME(timestamp/1000)) = DATE('2010-07-01'); 

Notez que la requête ne sera pas rapide es chaque valeur de votre table devra être convertie en une date de comparaison. Dès que cette requête commence à poser des problèmes (et pas une seconde plus tôt), vous pouvez utiliser une approche utilisant 2 horodatages pour le début et la fin de la journée, ce qui ne nécessiterait pas beaucoup de frais de conversion. Je vais laisser cela comme un exercice à l'envie cependant;)

+0

Merci beaucoup! Une question de plus: Est-il possible que je puisse créer une déclaration sql dans laquelle j'ai plusieurs dates? Par exemple, j'ai besoin des lignes pour date1 = '2010-07-01', date2 = '2010-07-02', date3 = '2010-07-03', ... Bien sûr, je peux faire x fois la déclaration SQL , mais peut-être que je peux faire une déclaration pour toutes les différentes dates? – Tim

+0

Si je comprends bien, vous voulez faire quelque chose comme 'DATE (FROM_UNIXTIME (timestamp/1000)) IN (DATE ('2010-07-01'), DATE ('2010-07-05'), DATE (' 2010-07-08 ')) '. Cela devrait fonctionner. Idem pour l'opérateur BETWEEN (voir http://dev.mysql.com/doc/refman/5.1/de/comparison-operators.html). Je suis à court de temps, donc je ne peux pas valider ma demande dès maintenant. Cela devrait être assez trivial cependant. Cheers – sfussenegger

+0

Non, ce n'est pas ce que je veux. Si je fais un "in (Date (...), ...)", j'obtiens une ligne de résultat (!). Mais je veux avoir une ligne de résultat par date. – Tim

2
SELECT * FROM your_table 
WHERE DATE(FROM_UNIXTIME(timestamp /1000)) between '2010-07-01 00:00:00' and '2010-07-01 23:59:59' 
+0

un horodatage de 13 chiffres contient des millisecondes, sinon ce serait 40 * 1000 ans de l'époque, donc autour de 42010;) – sfussenegger

+0

Merci, corrigé. – dcp

0

L'horodatage contient les ms:/si vous regardez le temps 127 902 676 7 et le moment où vous avez 127 795 319 0 942 vous verrez qu'il est composé bar le dernier 4 entiers de 0942 ie .9ms, vous devez le convertir en un timestamp UNIX d'époque

Selon si vous utilisez PHP, voici une petite fonction pour vous

<?php 
function EpochToUnix($t) 
{ 
     return mktime(substr($t,8,2),substr($t,10,2),ubstr($t,12,2),substr($t,4,2),substr($t,6,2),substr($t,0,4)); 
} 
?> 

Mais vous pouvez voir wqhat vous avez faire