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)

220
demandé sur marc_s 2009-10-05 19:30:06

19 réponses

SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
460
répondu LukeH 2009-10-05 15:32:32

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)
92
répondu Jithin Shaji 2014-10-22 10:51:58

SQL Server 2008:

SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
21
répondu Marcos Krucken 2014-08-04 18:34:05

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)
12
répondu Mayo 2009-10-05 15:34:19

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
5
répondu dove 2009-10-05 15:33:03

Cela fonctionne aussi:

    SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
4
répondu Alan Burstein 2013-08-02 20:55:37

Requête Simple:

SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) 
-- Instead of GetDate you can put any date.
4
répondu Abhishek Gupta 2015-04-02 10:08:14
SELECT @myDate - DAY(@myDate) + 1
2
répondu PoloSoares 2014-12-10 06:53:58

Veuillez utiliser ceci

  1. Pour Le Serveur 2012

    DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
    
  2. 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)
    
2
répondu adnan umar 2016-05-23 17:57:25

Futurs googlers, sur MySQL, essayez ceci:

select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
1
répondu Ariel T 2013-12-13 15:54:30

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.

1
répondu Ang Li 2017-06-15 12:21:45

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'
1
répondu Pradeep Thakur 2017-08-20 08:29:56

Si vous utilisez SQL Server 2012 ou supérieur;

SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))
1
répondu Lankymart 2017-09-06 11:12:11

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

0
répondu Tushar 2015-03-12 07:30:34
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

0
répondu Sayka 2015-04-05 21:09:30

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!

0
répondu Eli 2015-09-02 19:58:19

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')
0
répondu Jelly 2015-11-13 02:32:41

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)
0
répondu wayner 2016-08-10 01:47:40

Cela semble bêtement simple, mais fonctionne pour moi:

  select DATE_FORMAT(NOW(), '%Y-%m-1')
-2
répondu jsarma 2014-08-14 21:49:41