web-dev-qa-db-fra.com

Comment sélectionner le premier jour d'un mois en SQL?

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.

241
Brann
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
495
LukeH

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)
102
Jithin Shaji

SQL Server 2008:

SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
27
Marcos Krucken

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)
12
Mayo

Requête simple:

SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) 
-- Instead of GetDate you can put any date.
7
Abhishek Gupta

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
5
dove

Cela fonctionne aussi:

    SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
4
Alan Burstein
SELECT @myDate - DAY(@myDate) + 1
2
PoloSoares

S'il vous plaît utiliser cette

  1. Pour Server 2012

    DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
    
  2. Avant Server 2012

    select  cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime)
    
2
adnan umar
----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
2
kaub0st3r
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))
1
Brian Widdoes

Les futurs googlers, sur MySQL, essayez ceci:

select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
1
Ariel T

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.

1
Ang Li

Si vous utilisez SQL Server 2012 ou supérieur;

SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))
1
Lankymart

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'
1
Pradeep Thakur

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')
0
Jelly

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!

0
Eli

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

0
Tushar

Dans SQL Server 2012,

 select getdate()-DATEPART(day, getdate())+1

 select DATEADD(Month,1,getdate())-DATEPART(day, getdate())
0
BornToCode

Cette requête devrait très bien fonctionner sur MySQL:

SELECT concat(left(curdate(),7),'-01') 
0
user11869348

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)
0
wayner

Premier et dernier jour du mois en cours:

select dateadd(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay, 
eomonth(getdate()) as LastDay
0
nicolai koroslev

J'aime utiliser FORMAT, vous pouvez même spécifier une heure

SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month
0
michal
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

0
Sayka