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.
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
Oltre a tutte le risposte precedenti, un modo basato su una funzione introdotta in sql 2012
SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)
SQL Server 2008:
SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
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)
Query semplice:
SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
-- Instead of GetDate you can put any date.
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
Anche questo funziona:
SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
SELECT @myDate - DAY(@myDate) + 1
Si prega di usare questo
Per Server 2012
DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
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)
----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))
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))
I futuri googler, su MySQL, prova questo:
select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
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.
Se si utilizza SQL Server 2012 o successivo;
SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))
Prova ad eseguire la seguente query:
SELECT DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE-INTERVAL 1 DAY),INTERVAL 1 DAY),INTERVAL -1 MONTH)
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'
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')
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!
seleziona CONVERT (data, DATEADD (dd, - (DATEPART (dd, getdate ()) - 1), getdate ()), 120)
Questa funzione fornirà la data parte della data di inizio del mese
In Sql Server 2012,
select getdate()-DATEPART(day, getdate())+1
select DATEADD(Month,1,getdate())-DATEPART(day, getdate())
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)
Primo e ultimo giorno del mese corrente:
select dateadd(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay,
eomonth(getdate()) as LastDay
Mi piace usare FORMAT
, puoi anche specificare un orario
SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month
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