web-dev-qa-db-it.com

Come posso selezionare il primo giorno del mese in SQL?

Devo solo selezionare il primo giorno del mese di una determinata variabile datetime.

So che è abbastanza facile usare questo tipo di codice:

select CAST(CAST(YEAR(@mydate) AS VARCHAR(4)) 
+ '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)

Ma non è molto elegante, e probabilmente neanche molto veloce.

C'è un modo migliore per farlo? Sto usando SQL Server 2008.

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

Oltre a tutte le risposte precedenti, un modo basato su una funzione introdotta in 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

Il casting di una stringa (ad esempio "5/1/2009") in data/ora è sicuramente più leggibile ma abbiamo trovato il codice qualche tempo fa che restituirebbe il primo del mese ...

DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
12
Mayo

Query semplice:

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

Probabilmente è abbastanza veloce. Perché non crearlo come una funzione 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

Anche questo funziona:

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

Si prega di usare questo

  1. Per Server 2012

    DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
    
  2. Prima di 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))

Il -2 ti porterà il primo giorno del mese scorso. cioè, getdate () è il 15/10/18. I tuoi risultati saranno 9/1/18. Passa a -1 e i risultati saranno 10/1/18. 0 sarebbe l'inizio del prossimo mese, 11/1/2018 .. ecc. Ecc.

o

DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))
1
Brian Widdoes

I futuri googler, su MySQL, prova questo:

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

Se lo stai osservando oggi e utilizzi SQL Server 2012 o versione successiva hai la funzione EOMONTH che semplifica le cose:

SELECT DATEADD(day, 1, EOMONTH(DATEADD(month, -1, GETDATE()))) as firstdateofmonth

È possibile modificare GETDATE () con qualsiasi variabile di data desiderata.

1
Ang Li

Se si utilizza SQL Server 2012 o successivo;

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

Prova ad eseguire la seguente query:

SELECT DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE-INTERVAL 1 DAY),INTERVAL 1 DAY),INTERVAL -1 MONTH)

1
divya

Qui possiamo usare sotto la query per la prima data del mese e l'ultima data del mese.

SELECT DATEADD(DAY,1,EOMONTH(Getdate(),-1)) as 'FD',Cast(Getdate()-1 as Date)
as 'LD'
1
Pradeep Thakur

Io personalmente raccomandavo che lo sql qui sotto, perché quando provo ad usare la funzione date nella clausola condizionale, rallenta molto la mia velocità di interrogazione.

comunque sentitevi liberi di provare questo.

select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01')
0
Jelly

Ho usato GETDATE () come data di lavoro, puoi sostituirlo con la data di cui hai bisogno. 
Ecco come funziona: per prima cosa formiamo la data nel formato YYYYMMDD ... troncando per mantenere solo i 6 caratteri più a sinistra al fine di mantenere solo la parte YYYYMM, e quindi aggiungere '01' come il mese - e voilà! hai il primo giorno del mese in corso.

SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth

A proposito, le prestazioni sono grandiose su questo!

0
Eli

seleziona CONVERT (data, DATEADD (dd, - (DATEPART (dd, getdate ()) - 1), getdate ()), 120)

Questa funzione fornirà la data parte della data di inizio del mese

0
Tushar

In Sql Server 2012,

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

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

Non per competere con nessuna delle grandi menti qui, ma un semplice suggerimento leggermente diverso rispetto alla risposta accettata sopra.

select dateadd(day, -(datepart(day,@date)+1,@date)
0
wayner

Primo e ultimo giorno del mese corrente:

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

Mi piace usare FORMAT, puoi anche specificare un orario

SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month
0
michal
SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE())

.................................................. ...................

Se non desideri il tempo, quindi convertilo in DATE o se vuoi fare in tempo a 0:00:00, Converti in DATE e poi di nuovo in DATETIME.

SELECT CONVERT (DATETIME,  
CONVERT (DATE, DATEADD (DAY, -1 * (DAY(GETDATE()) - 1),
GETDATE())))

Cambia GETDATE () alla data desiderata

0
Sayka