Déclarez dynamicment les dates de début et de fin du mois en cours

J'ai une requête assez simple que je cours tous les mois. Chaque mois, je dois modifier manuellement la requête pour qu'elle corresponde à la date de début et de fin du mois en cours. J'ai essayé d'utiliser certains des exemples de réponses précédentes, mais je ne peux pas sembler le faire fonctionner. Notamment parce que j'essaie d'inclure tout le dernier jour du mois, comme indiqué par mon paramètre 23:59:59. Quelle est la meilleure façon d'y parvenir?

SELECT * FROM WorkOrder where active = 1 and WorkOrderStatusId in (6,8) AND dateCreated >= '5/1/2017' and dateCreated <= '5/31/2017 23:59:59' 

Trois choses:

Premièrement: les dates ressemblent à 2017-05-01 non à 5/1/2017 dans la plupart des représentations SGBD.

Deuxièmement: vous voulez ce genre d'expression (notez le < ) pour vous assurer que vous obtenez toutes les lignes. C'est une meilleure approche que les choses 23:59:59 .

 where dateCreated >= '2017-05-01' and dateCreated < '2017-06-01' 

Troisièmement, vous voulez probablement une façon de dire

  where dateCreated >= first_day_of_last_month and dateCreated < first_day_of_this_month 

d'une manière où vous ne devez pas changer la requête tous les mois.

Cela fonctionne différemment dans différentes marques et templates de server de database. Vous ne nous avez pas dit lequel vous utilisez, alors …

Dans MS SQL Server, DATEADD(DAY, 1-DATEPART(DAY, GETDATE()), GETDATE()) vous donne le premier du mois actuel, donc

 where dateCreate >= DATEADD(MONTH, -1, DATEADD(DAY, 1-DATEPART(DAY, GETDATE()), GETDATE())) and dateCreate < DATEADD(DAY, 1-DATEPART(DAY, GETDATE()), GETDATE()) 

En MySQL DATE_FORMAT(CURDATE(), '%Y-%m-01') vous donne minuit le premier jour du mois actuel, donc cette clause where obtient les lignes du mois dernier.

 where dateCreated >= DATE_FORMAT(CURDATE(), '%Y-%m-01') - INTERVAL 1 MONTH and dateCreated < DATE_FORMAT(CURDATE(), '%Y-%m-01') 

Dans Oracle (cue si j'étais un homme riche de Fiddler on the Roof ), TRUNC(SYSDATE, 'MM') vous donne le premier du mois, donc cela obtient les lignes du mois dernier.

 where dateCreate >= ADD_MONTHS(-1, TRUNC(SYSDATE, 'MM')) and dateCreate < TRUNC(SYSDATE, 'MM') 

ce que vous pouvez réellement faire est d'get le mois et l'année

 SELECT * FROM WorkOrder where active = 1 and WorkOrderStatusId in (6,8) AND year(dateCreated) = 2017 month(dateCreated) = 5