Comment puis-je sélectionner le premier jour d'un mois en SQL?
J'ai juste besoin de sélectionner le premier jour du mois d'une variable datetime.
Je sais que c'est assez facile à faire en utilisant 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.
Est-il une meilleure façon de le faire ? (J'utilise SQL Server 2008)
19 réponses
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
En plus de la réponse 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))
Le casting d'une chaîne (c'est-à-dire "5/1/2009") à datetime est certainement plus lisible mais nous avons trouvé du code il y a quelque temps qui retournerait le premier du mois...
DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
C'est probablement assez rapide. Pourquoi ne pas le créer en tant que 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
Requête Simple:
SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
-- Instead of GetDate you can put any date.
Veuillez utiliser ceci
-
Pour Le Serveur 2012
DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
-
Avant Le Serveur 2012
select cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime)
Futurs googlers, sur MySQL, essayez ceci:
select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
Si vous regardez cela aujourd'hui, et en utilisant SQL server 2012 ou plus récent, vous avez la fonction EOMONTH qui rend les choses plus faciles:
SELECT DATEADD(day, 1, EOMONTH(DATEADD(month, -1, GETDATE()))) as firstdateofmonth
Vous pouvez changer GETDATE () avec la variable de date que vous voulez.
Ici, nous pouvons utiliser ci-dessous la requête à 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'
Si vous utilisez SQL Server 2012 ou supérieur;
SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))
Sélectionnez Convertir (date, DATEADD(dd, - (DATEPART (dd,GETDATE ()) -1), getdate ()), 120)
Cette fonction vous fournira une partie date de la date de début du mois
SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE())
.....................................................................
Si vous ne voulez pas l'heure, convertissez-la en DATE ou si vous voulez passer à l'heure à 0: 00: 00, convertissez - la en DATE, puis revenez à DATETIME.
SELECT CONVERT (DATETIME,
CONVERT (DATE, DATEADD (DAY, -1 * (DAY(GETDATE()) - 1),
GETDATE())))
Changez GETDATE () à la date que vous voulez
J'ai utilisé GETDATE() comme date de travail, vous pouvez le remplacer par la date dont vous avez besoin.
Voici comment cela fonctionne: nous formatons D'abord la date en AAAAMMJJ... formatez la troncature pour ne garder que les 6 caractères les plus à gauche afin de ne garder que la partie YYYYMM, puis ajoutez '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 grande sur ce!
J'ai personnellement recommandé que le sql ci-dessous parce que quand j'essaie d'utiliser la fonction date dans la clause condition, cela ralentit beaucoup ma vitesse de requête.
Quoi qu'il en soit, n'hésitez pas à essayer ceci.
select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01')
Ne pas rivaliser avec l'un des grands esprits ici, mais une simple suggestion légèrement différente que la réponse acceptée ci-dessus.
select dateadd(day, -(datepart(day,@date)+1,@date)
Cela semble bêtement simple, mais fonctionne pour moi:
select DATE_FORMAT(NOW(), '%Y-%m-1')