2008-12-27 6 views
1

J'ai un champ DATETIME. Je voudrais sélectionner tous les enregistrements qui ont été mis à jour la semaine dernière. En ce moment, j'utilise cette requête:MySQL DATETIME question

SELECT SUM(mins_spent) as time_sum FROM todos WHERE 
lastUpdate >= '2008-12-22' AND lastUpdate <='2008-12-28' 

Mais les résultats que je reçois semblent être différentes en fonction du temps de la journée, par exemple sur 19 heures que je pourrais obtenir 17 heures et 23 heures 14 I'l obtenir heures même si elle devrait augmenter, ne pas diminuer. Je pensais de changer la requête à:

SELECT SUM(mins_spent) as time_sum FROM todos WHERE 
lastUpdate >= '2008-12-22 00:00:00' AND lastUpdate <='2008-12-28 00:00:00' 

Est-ce que ça aiderait du tout? Suggestions s'il vous plaît ..

Répondre

5

'2008-12-22' doit être égal à '2008-12-22 00:00:00'.

Voulez-vous "jusqu'à la fin de la journée 28?" Si oui, ajoutez 23:59:59 à la 2ème date. Vous pouvez également utiliser lastUpdate < "2008-12-29".

Comment suivez-vous les modifications apportées à une tâche existante? INSERT et/ou DELETE? Ou UPDATE?

Si vous faites DELETE '' après avoir terminé, vous aurez juste moins d'enregistrements.

Si vous êtes UPDATE ', permettez-vous des dates pour changer au-delà de la semaine en cours? Si c'est le cas, ils seront supprimés de vos résultats.

Pour voir ce qui se passe, vous pouvez essayer d'attraper quelques agrégats sur la table, mins_spent, et lastUpdate (marquez les valeurs et exécutez occasionnellement pour voir comment ils changent).

SELECT count(*) AS Total 
FROM todos 
WHERE lastUpdate >= '2008-12-22' AND lastUpdate <= '2008-12-28 23:59:59' 

SELECT min(mins_spent) AS Min, max(mins_spent) AS Max, avg(mins_spent) AS Avg 
FROM todos 
WHERE lastUpdate >= '2008-12-22' AND lastUpdate <= '2008-12-28 23:59:59' 

SELECT min(lastUpdate) AS Min, max(lastUpdate) AS Max 
FROM todos 
WHERE lastUpdate >= '2008-12-22' AND lastUpdate <= '2008-12-28 23:59:59' 
+0

Je le veux du début de la journée 22ème début du jour 28ème.En ce moment je mets à jour les dossiers, et une fois qu'un todo est fini je le marque comme 'fait' et il n'est pas touché encore. Donc, je suis assez sûr que ce n'est pas mis à jour au-delà du temps d'achèvement –

1

A en juger par MySQL 6.0 Manuel de référence pour Date and Time Types, vous devriez être plus ou moins OK comme écrit. Cependant, si cela ne fonctionne vraiment pas, alors vous avez peut-être trouvé un bug à signaler.

Une valeur DATE est contrainte au type DATETIME en ajoutant la partie de temps comme '00: 00: 00'. Pour effectuer la comparaison en ignorant la partie du temps de la valeur DATETIME au lieu, utilisez la fonction CAST() pour effectuer la comparaison de la manière suivante:

date_col = CAST(NOW() as DATE); 

Vos requêtes disent « < = » 2008-12- 28 '; cela devrait être strictement moins que, pas moins-que-ou-égal. Un très bon point serait: est-ce que les expressions que vous avez écrites sont traitées comme DATETIME (parce que le LHS est une colonne DATETIME) ou comme DATE (parce que le RHS est mieux traité comme une DATE) ou, en fait, le DATETIME est converti en une chaîne pour correspondre à la RHS? Cela ferait une différence si le LHS était converti en DATE, parce que n'importe quand le 28 serait à portée, alors que vous semblez vouloir tout du 21 au 27. Que se passe-t-il si vous corrigez explicitement les types avec des conversions?

De plus, le serveur MySQL fonctionne-t-il dans le même fuseau horaire que vous? Il semblait y avoir une différence «à l'heure» entre ce que vous voyiez et la fin de la journée. Je ne sais toujours pas exactement comment cela pourrait (fonctionner), mais ce pourrait être un facteur non pris en compte.