Je dois juste sélectionner le premier jour du mois d'une variable datetime donnée.
Je sais que c'est assez facile à faire avec ce genre de code:
select CAST(CAST(YEAR(@mydate) AS VARCHAR(4))
+ '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)
Mais ce n’est pas très élégant et probablement pas très rapide non plus.
Y a-t-il une meilleure manière de faire cela? J'utilise SQL Server 2008.
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
En plus de toutes les réponses ci-dessus, un moyen basé sur une fonction introduite dans sql 2012
SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)
SQL Server 2008:
SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
La transtypage d'une date (c'est-à-dire "01/05/2009") à datetime est certainement plus lisible, mais nous avons trouvé du code il y a quelque temps qui renverrait le premier jour du mois ...
DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
Requête simple:
SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
-- Instead of GetDate you can put any date.
C'est probablement assez rapide. Pourquoi ne pas le créer comme une fonction SQL.
CREATE FUNCTION [dbo].[GetFirstDayOfMonth] ( @InputDate DATETIME )
RETURNS DATETIME
BEGIN
RETURN CAST(CAST(YEAR(@InputDate) AS VARCHAR(4)) + '/' +
CAST(MONTH(@InputDate) AS VARCHAR(2)) + '/01' AS DATETIME)
END
GO
Cela fonctionne aussi:
SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
SELECT @myDate - DAY(@myDate) + 1
S'il vous plaît utiliser cette
Pour Server 2012
DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
Avant Server 2012
select cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime)
----Last Day of Previous Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
LastDay_PreviousMonth
----Last Day of Current Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
LastDay_CurrentMonth
----Last Day of Next Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0))
LastDay_NextMonth
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(Getdate(),-2))
Le -2 vous donnera le premier jour du mois dernier. C'est-à-dire que getdate () vaut 10/15/18. Vos résultats seraient 9/1/18. Changez à -1 et vos résultats seraient 10/1/18. 0 serait le début du mois prochain, le 01/11/2018 .. etc. etc.
ou
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))
Les futurs googlers, sur MySQL, essayez ceci:
select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
Si vous examinez la situation aujourd'hui et utilisez SQL Server 2012 ou une version plus récente, vous disposez de la fonction EOMONTH qui facilite les choses:
SELECT DATEADD(day, 1, EOMONTH(DATEADD(month, -1, GETDATE()))) as firstdateofmonth
Vous pouvez modifier GETDATE () avec la variable de date de votre choix.
Si vous utilisez SQL Server 2012 ou supérieur;
SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))
Ici, nous pouvons utiliser la requête ci-dessous pour la première date du mois et la dernière date du mois.
SELECT DATEADD(DAY,1,EOMONTH(Getdate(),-1)) as 'FD',Cast(Getdate()-1 as Date)
as 'LD'
J'ai personnellement recommandé que le sql ci-dessous parce que quand j'essaie d'utiliser la fonction de date dans la clause condition, sa vitesse ralentit beaucoup ma requête.
quoi qu'il en soit, n'hésitez pas à essayer cela.
select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01')
J'ai utilisé GETDATE () comme date de travail, vous pouvez le remplacer par la date dont vous avez besoin.
Voici comment cela fonctionne: Nous formons d’abord la date au format AAAAMMJJ ... au format tronqué pour ne conserver que les 6 caractères les plus à gauche afin de ne conserver que la partie AAAAMM, puis nous ajoutons «01» comme mois et le tour est joué! vous avez le premier jour du mois en cours.
SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth
BTW, la performance est excellente sur ce point!
sélectionnez CONVERT (date, DATEADD (dd, - (DATEPART (dd, getdate ()) - 1), getdate ()), 120)
Cette fonction vous fournira une partie de la date de début du mois
Dans SQL Server 2012,
select getdate()-DATEPART(day, getdate())+1
select DATEADD(Month,1,getdate())-DATEPART(day, getdate())
Cette requête devrait très bien fonctionner sur MySQL:
SELECT concat(left(curdate(),7),'-01')
Ne pas concurrencer les grands esprits, mais simplement suggérer une suggestion légèrement différente de celle acceptée ci-dessus.
select dateadd(day, -(datepart(day,@date)+1,@date)
Premier et dernier jour du mois en cours:
select dateadd(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay,
eomonth(getdate()) as LastDay
J'aime utiliser FORMAT
, vous pouvez même spécifier une heure
SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month
SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE())
.................................................. ...................
Si vous ne voulez pas l'heure, convertissez-la en DATE ou si vous souhaitez définir l'heure en 0:00:00, convertissez-la en DATE puis de nouveau en DATETIME.
SELECT CONVERT (DATETIME,
CONVERT (DATE, DATEADD (DAY, -1 * (DAY(GETDATE()) - 1),
GETDATE())))
Remplacez GETDATE () par la date souhaitée