Ich muss nur den ersten Tag des Monats einer bestimmten Datums-/Zeitvariablen auswählen.
Ich weiß, dass es ziemlich einfach ist, diese Art von Code zu verwenden:
select CAST(CAST(YEAR(@mydate) AS VARCHAR(4))
+ '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)
Dies ist jedoch nicht sehr elegant und wahrscheinlich auch nicht sehr schnell.
Gibt es einen besseren Weg, dies zu tun? Ich verwende SQL Server 2008.
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
Ein Weg, der auf einer der in sql 2012
eingeführten Funktionen basiert
SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)
SQL Server 2008:
SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
Das Casting eines Strings (d. H. "01.05.2009") in datetime ist sicherlich lesbarer, aber wir fanden Code vor einiger Zeit, der den ersten des Monats zurückgeben würde ...
DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
Einfache Abfrage:
SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
-- Instead of GetDate you can put any date.
Es ist wahrscheinlich ziemlich schnell. Warum nicht als SQL-Funktion erstellen?.
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
Das funktioniert auch:
SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
SELECT @myDate - DAY(@myDate) + 1
Bitte benutzen Sie diese
Für Server 2012
DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
Vor dem 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))
Mit der -2 erhalten Sie den ersten Tag des letzten Monats. getdate () ist also 15.10.18. Ihre Ergebnisse wären der 01.09.18. Wechseln Sie zu -1 und Ihre Ergebnisse wären 10/1/18. 0 wäre der Beginn des nächsten Monats, 1.11.18 ... usw. usw.
oder
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))
Zukünftige Googler auf MySQL versuchen dies:
select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
Wenn Sie sich das heute anschauen und SQL Server 2012 oder neuer verwenden, haben Sie die EOMONTH-Funktion, die die Dinge vereinfacht:
SELECT DATEADD(day, 1, EOMONTH(DATEADD(month, -1, GETDATE()))) as firstdateofmonth
Sie können GETDATE () mit der gewünschten Datumsvariablen ändern.
Bei Verwendung von SQL Server 2012 oder höher;
SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))
Führen Sie die folgende Abfrage aus:
SELECT DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE-INTERVAL 1 DAY),INTERVAL 1 DAY),INTERVAL -1 MONTH)
Hier können wir die unten stehende Abfrage zum ersten Datum des Monats und zum letzten Datum des Monats verwenden.
SELECT DATEADD(DAY,1,EOMONTH(Getdate(),-1)) as 'FD',Cast(Getdate()-1 as Date)
as 'LD'
Ich persönlich empfahl, dass das SQL unten, weil, wenn ich versuche, Datumsfunktion in der Bedingungsklausel zu verwenden, meine Abfragegeschwindigkeit sehr verlangsamt.
sie können es trotzdem versuchen.
select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01')
Ich habe GETDATE () als Datum verwendet, um damit zu arbeiten. Sie können es durch das Datum ersetzen, das Sie benötigen.
So funktioniert das: Zuerst formatieren wir das Datum im Format JJJJJMMTT ... und werden abgeschnitten, um nur die 6 Zeichen ganz links zu behalten, um nur den Teil JJJJJMM beizubehalten, und fügen Sie als Monat "01" - und voila! Sie haben den ersten Tag des aktuellen Monats.
SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth
Übrigens, die Leistung ist großartig!
wählen Sie CONVERT (Datum, DATEADD (TT, - (DATEPART (dd, getdate ()) - 1), getdate ()), 120
Diese Funktion liefert Ihnen einen Teil des Startdatums des Monats
In SQL Server 2012
select getdate()-DATEPART(day, getdate())+1
select DATEADD(Month,1,getdate())-DATEPART(day, getdate())
Diese Abfrage sollte unter MySQL sehr gut funktionieren:
SELECT concat(left(curdate(),7),'-01')
Um mit keinem der großen Geister hier zu konkurrieren, sondern mit einem einfachen Vorschlag, der etwas anders ist als in der oben akzeptierten Antwort.
select dateadd(day, -(datepart(day,@date)+1,@date)
Erster und letzter Tag des aktuellen Monats:
select dateadd(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay,
eomonth(getdate()) as LastDay
Ich benutze gerne FORMAT
, Sie können sogar eine Zeit angeben
SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month
SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE())
.................................................. ...................
Wenn Sie die Zeit nicht wünschen, dann konvertieren Sie sie in DATE oder wenn Sie die Uhrzeit auf 0:00:00 setzen möchten, Konvertieren Sie in DATE und dann wieder in DATETIME.
SELECT CONVERT (DATETIME,
CONVERT (DATE, DATEADD (DAY, -1 * (DAY(GETDATE()) - 1),
GETDATE())))
Ändern Sie GETDATE () auf das gewünschte Datum