web-dev-qa-db-fra.com

MySQL uniquement dans le mois en cours?

J'ai la requête MySQL suivante, et j'essaye de l'ajuster afin qu'elle ne récupère que les résultats du mois en cours (de l'année en cours). J'imagine que vous aurez peut-être besoin d'informations supplémentaires sur ma structure MySQL. - J'ai un horodatage UNIX généré par la time() de PHP stocké dans la colonne time (sous la table referrals), donc avec la configuration ci-dessous, ce serait t2.time.

Donc, mon problème est que je ne sais pas comment procéder, je suppose que ce serait quelque chose comme ajouter ce qui suit à la fin de la clause WHERE? => AND t2.time IS WITHIN THE CURRENT MONTH (les majuscules sont allumées pour distinguer le problème du reste de la requête) mais je ne sais pas comment vérifier si sa date est celle du mois en cours.

La requête MySQL:

SELECT t1.username,
       t1.website,
       SUM(IF(t2.type = 'in', 1, 0))  AS in_count,
       SUM(IF(t2.type = 'out', 1, 0)) AS out_count
FROM   users AS t1
       JOIN referrals AS t2
         ON t1.username = t2.author
WHERE  t1.website != ''
GROUP  BY t1.username,
          t1.website
ORDER  BY in_count DESC 
LIMIT  0, 10 

Appréciez toute aide! : B

11
newbtophp

vous pouvez utiliser from_unixtime like

date_format(from_unixtime(t2.`time`), '%Y-%m')=date_format(now(), '%Y-%m')

Mais je pense que le type de données integer ne convient pas à cette exigence

Je pense que l’utilisation de datetime conviendra mieux. Construit un index sur cette colonne et facilite également le filtrage, comme

t2.`time`>='2011-01-01' and t2.`time`<'2011-02-01'

ou

date_format(t2.`time`, '%Y-%m')=date_format(now(), '%Y-%m')
14
ajreal

Vous devez limiter les résultats en utilisant YEAR() et MONTH()functions . Modifiez la partie WHERE de votre requête comme suit:

WHERE t1.website != ''
AND YEAR(time) = YEAR(NOW())
AND MONTH(time) = MONTH(NOW())
66
Anax
where t2.time >= extract(YEAR_MONTH from CURRENT_DATE) 
  and t2.time <  extract(YEAR_MONTH from CURRENT_DATE + INTERVAL 1 MONTH)

Ceci suppose que t2.time est un type datetime. S'il s'agit d'un horodatage unix entier, vous pouvez convertir les limites de date-heure supérieure et inférieure créées à l'aide de la fonction UNIX_TIMESTAMP ().

2
goat

C’est probablement beaucoup plus simple que ce à quoi vous vous attendez.

SELECT t1.username,
       t1.website,
       SUM(IF(t2.type = 'in', 1, 0))  AS in_count,
       SUM(IF(t2.type = 'out', 1, 0)) AS out_count
FROM   users AS t1
       JOIN referrals AS t2
         ON t1.username = t2.author
WHERE  t1.website != ''
       AND t2.time >= DATE_SUB( CURRENT_DATE, INTERVAL 1 DAY )
GROUP  BY t1.username,
          t1.website
ORDER  BY in_count DESC 
LIMIT  0, 10 
2
Ryan Gooler

Pour de meilleures performances (-> use index), créez un index sur votre colonne de date et nommez un "entre" dans votre clause where.

select ... from my_table where my:date_field between concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01')
and adddate(concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01'), interval 1 month);
0
Cedric Simon