9
votes

Mysql: Comment puis-je trouver "Date de la dernière lundi" (problème de performance)

Y a-t-il un moyen plus simple que d'écrire:

Sélectionnez DATE_SUB (CURDATE (CURDATE (CURDATE (CURDATE (CURDATE (CURDATE (CURDATE ()) JOUR) AS LastMonday
de Dual


1 commentaires

Je pense que cela est aussi simple que vous le ferez.


3 Réponses :


31
votes

Si vous n'utilisez pas un ancien mySQL, vous pouvez envelopper cela dans une fonction stockée.

set @LastMonday=LastMonday();
select @Lastmonday; 


4 commentaires

C'est exactement ce que j'avais "évité" les grands calculs de la Date jusqu'à présent ... j'étais / suis inquiet pour les frais généraux potentiels ...


J'ai depuis ajouté votre suggestion de "mise à jour de performance" à notre codeBase. Cela fait une énorme différence, je m'attendais à ce que la fonction soit appelée qu'une seule fois. (Mais comment est l'optimiseur de savoir que je ne retourne pas de temps en millisecondes ..)


L'astuce ici est que la valeur est calculée une fois et ensuite cache manuellement. Vous pouvez essayer ce que l'optimiseur fait. Il pourrait être assez intelligent de la mettre en cache aussi, mais vous ne pouvez pas vraiment compter sur elle.


Si aujourd'hui est lundi, cela reviendra aujourd'hui



-1
votes

Essayez ceci:

-- Today is 05 April 2013

-- Get Last Monday from MySQL

SELECT DATE_FORMAT(LAST_DAY(NOW()) - ((7 + WEEKDAY(LAST_DAY(NOW())) - 7) % 7), '%Y-%m-%d') last_monday;

-- Output

last_monday  
-------------
2013-04-29  


2 commentaires

Pour moi, ce n'est ni plus simple, ni plus performant que le code dans la question? .. Mais je vais prendre l'indice et donnera une phrase le titre de la question!


Pour moi, ces produits ne sont pas lundi prochains, mais le lundi après cela.



0
votes
SET @dateCurrent = CURDATE();
SET @dateCurrentDayInWeek = DAYOFWEEK(@dateCurrent) - 2;
SET @dateLastMonday = DATE_ADD(@dateCurrent, INTERVAL -@dateCurrentDayInWeek DAY);

SELECT @dateLastMonday;

1 commentaires

Ce retour ne serait-il pas un jour le dimanche Suivant lundi au lieu de la précédente?