web-dev-qa-db-fra.com

Comment choisir entre le 1er jour du mois actuel et le jour actuel dans MySQL?

Je dois sélectionner des données de la base de données MySQL entre le premier jour du mois en cours et le jour en cours.

select*from table_name 
where date between "1st day of current month" and "current day"

Quelqu'un peut-il fournir un exemple de travail de cette requête?

46
Nurlan
select * from table_name 
where (date between  DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), interval 30 day), interval 1 day) AND CURDATE() )

Ou mieux : 

select * from table_name 
where (date between  DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW() )
119
aleroot

Je cherchais une requête similaire dans laquelle je devais utiliser le premier jour du mois dans ma requête . La fonction last_day ne fonctionnait pas pour moi, mais DAYOFMONTH était pratique.

Ainsi, si quelqu'un recherche le même problème, le code suivant renvoie la date du premier jour du mois en cours. 

SELECT DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY);

Comparer une colonne de date avec le premier jour du mois:

select * from table_name where date between 
DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY) and CURRENT_DATE
26
Shri
select * from table_name 
where `date` between curdate() - dayofmonth(curdate()) + 1
                 and curdate()

Exemple SQLFiddle

5
juergen d

J'ai utilisé la requête suivante. Cela a très bien fonctionné pour moi par le passé.

select date(now()) - interval day(now()) day + interval 1 day
3

essaye ça :

SET @StartDate = DATE_SUB(DATE(NOW()),INTERVAL (DAY(NOW())-1) DAY);
SET @EndDate = ADDDATE(CURDATE(),1);
select * from table where (date >= @StartDate and date < @EndDate);
2
shaku740
select * from <table>
where <dateValue> between last_day(curdate() - interval 1 month + interval 1 day)
                  and curdate();
1
gregg

Solution complète pour le mois et l'année courant mysql, qui utilise également correctement l'indexation :)

-- Current month
SELECT id, timestampfield 
  FROM table1
 WHERE timestampfield >= DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY)
   AND timestampfield <=  LAST_DAY(CURRENT_DATE);

-- Current year
SELECT id, timestampfield 
  FROM table1
 WHERE timestampfield >= DATE_SUB(CURRENT_DATE, INTERVAL DAYOFYEAR(CURRENT_DATE)-1 DAY)
   AND timestampfield <=  LAST_DAY(CURRENT_DATE);
1
Imran Zahoor
SELECT date_sub(current_date(),interval dayofmonth(current_date())-1 day) as first_day_of_month;
0
select * from table
where date between 
(date_add (CURRENT_DATE, INTERVAL(1 - DAYOFMonth(CURRENT_DATE)) day)) and current_date;
0
Daniel

Une approche moins orthodoxe pourrait être

SELECT * FROM table_name 
WHERE LEFT(table_name.date, 7) = LEFT(CURDATE(), 7)
  AND table_name.date <= CURDATE();

comme une date comprise entre le premier du mois et maintenant équivaut à une date de ce mois et avant maintenant. Je pense que c'est un peu plus facile pour les yeux que d'autres approches, cependant.

0
Lyckberg

J'avais quelques exigences similaires - à find first day of the month mais sur la base de year end month sélectionné par l'utilisateur dans sa page de profil.

Enoncé du problème - retrouvez toutes les txns faites par l'utilisateur au cours de son exercice financier. Financial year est déterminé à l'aide de year end mois, où month peut être n'importe quel mois valide: 1 for Jan, 2 for Feb, 3 for Mar, ....12 for Dec

Pour certains clients, financial year ends sur March et d’autres l’observent sur December.

Scenarios - (Today is `08 Aug, 2018`)
   1. If `financial year` ends on `July` then query should return `01 Aug 2018`.
   2. If `financial year` ends on `December` then query should return `01 January 2018`.
   3. If `financial year` ends on `March` then query should return `01 April 2018`.
   4. If `financial year` ends on `September` then query should return `01 October 2017`.

Et enfin, ci-dessous se trouve la requête. - 

select @date := (case when ? >= month(now()) 
then date_format((subdate(subdate(now(), interval (12 - ? + month(now()) - 1) month), interval day(now()) - 2 day)) ,'%Y-%m-01')
else date_format((subdate(now(), interval month(now()) - ? - 1 month)), '%Y-%m-01') end)

? est year end mois (valeurs de 1 à 12).

0
Tirath

J'ai utilisé celui-ci select DATE_ADD(DATE_SUB(LAST_DAY(now()), INTERVAL 1 MONTH),INTERVAL 1 day) first_day , LAST_DAY(now()) last_day, date(now()) today_day

0
Andrey