MySQL sélectionne toutes les lignes du mois dernier jusqu’à (maintenant () – 1 mois), à des fins de comparaison

J’ai besoin d’aide pour écrire une requête MySQL pour afficher les lignes du mois dernier, mais pas le mois entier, uniquement jusqu’au jour, heure et minute, comme c’est le cas maintenant (), mais 1 mois avant.

Par exemple, si aujourd’hui nous sums le 19/05 à 17h25, je dois sélectionner des lignes de minuit de 12h à 16h15 à 17h25 du 19/01 (à partir de la même année, bien sûr).

Merci!

Vous pouvez obtenir le premier du mois en calculant le dernier jour du mois précédent et en ajoutant un jour. C’est gênant, mais je pense qu’il vaut mieux que formater une date sous forme de chaîne et l’utiliser pour le calcul.

select * from yourtable t where /* Greater or equal to the start of last month */ t.date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) and /* Smaller or equal than one month ago */ t.date <= DATE_SUB(NOW(), INTERVAL 1 MONTH) 

Obtenir un mois auparavant est facile avec une seule fonction MySQL:

 SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH); 

ou

 SELECT NOW() - INTERVAL 1 MONTH; 

header de ma tête, je ne peux pas penser à une manière élégante de recevoir le premier jour du mois dernier dans MySQL, mais cela fonctionnera certainement:

 SELECT CONCAT(LEFT(NOW() - INTERVAL 1 MONTH,7),'-01'); 

Assemblez-les et vous obtenez une requête qui résout votre problème:

 SELECT * FROM your_table WHERE t >= CONCAT(LEFT(NOW() - INTERVAL 1 MONTH,7),'-01') AND t <= NOW() - INTERVAL 1 MONTH 

Code simple s’il vous plaît vérifier

 SELECT * FROM table_name WHERE created <= (NOW() - INTERVAL 1 MONTH) 

Ceci est un exemple d’une opération de date MySQL pertinente pour votre question:

 SELECT DATE_ADD( now( ) , INTERVAL -1 MONTH ) 

Ce qui précède renverra la date il y a un mois

Vous pouvez donc l’utiliser comme suit:

 SELECT * FROM your_table WHERE Your_Date_Column BETWEEN '2011-01-04' AND DATE_ADD(NOW( ), INTERVAL -1 MONTH ) 
 SELECT * FROM table WHERE date BETWEEN ADDDATE(LAST_DAY(DATE_SUB(NOW(),INTERVAL 2 MONTH)), INTERVAL 1 DAY) AND DATE_SUB(NOW(),INTERVAL 1 MONTH); 

Consultez les documents pour plus d’informations sur DATE_SUB , ADDDATE , LAST_DAY et d’autres fonctions datetime utiles.

Vous pouvez utiliser une clause WHERE comme:

 WHERE DateColumn BETWEEN CAST(date_format(date_sub(NOW(), INTERVAL 1 MONTH),'%Y-%m-01') AS date) AND date_sub(now(), INTERVAL 1 MONTH) 

SELECT * FROM table WHERE myDtate BETWEEN maintenant (), DATE_SUB (NOW (), INTERVAL 1 MONTH)

Ma solution consistait à éviter d’utiliser NOW() lors de l’écriture de SQL avec votre langage de programmation, et de remplacer par une chaîne. Le problème avec NOW() comme vous l’indiquez, c’est qu’il inclut l’heure actuelle. Donc, pour capturer à partir du début du jour de la requête (0 heure et minute) au lieu de:

 r.date <= DATE_SUB(NOW(), INTERVAL 99 DAY) 

J'ai fait (php):

 $current_sql_date = date('Ymd 00:00:00'); 

dans le sql:

 $sql_x = "r.date <= DATE_SUB('$current_sql_date', INTERVAL 99 DAY)" 

Avec cela, vous allez récupérer des données à partir de minuit du jour donné