Musím si vybrat první den měsíce dané proměnné datetime.
Vím, že je to snadné použít tento typ kódu:
select CAST(CAST(YEAR(@mydate) AS VARCHAR(4))
+ '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)
Ale to není příliš elegantní a pravděpodobně ani příliš rychlý.
Existuje lepší způsob, jak to udělat? Používám SQL Server 2008.
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
Kromě výše uvedené odpovědi, způsob založený na funkci zavedené v sql 2012
SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)
SQL Server 2008:
SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
Odlévání řetězce (tj. "5/1/2009") na datetime je jistě více čitelné, ale kód jsme našli zpět, který by vrátil první měsíc ...
DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
Jednoduchý dotaz:
SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
-- Instead of GetDate you can put any date.
Je to asi dost rychlé. Proč ji nevytvořit jako funkci 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
To funguje také:
SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
SELECT @myDate - DAY(@myDate) + 1
Použijte toto
Pro Server 2012
DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
Před serverem 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))
-2 vám přinese první den posledního měsíce. tj. getdate () je 10/15/18. Vaše výsledky budou 9/1/18. Změňte na -1 a vaše výsledky budou 10/1/18. 0 bude začátek příštího měsíce, 11/1/2018 .. atd.
nebo
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))
Budoucí googlery, na MySQL, zkuste toto:
select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
Pokud se na to dnes díváte a používáte SQL server 2012 nebo novější, máte k dispozici funkci EOMONTH, která usnadňuje práci:
SELECT DATEADD(day, 1, EOMONTH(DATEADD(month, -1, GETDATE()))) as firstdateofmonth
Můžete změnit GETDATE () s libovolnou proměnnou data, kterou chcete.
Pokud používáte SQL Server 2012 nebo vyšší;
SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))
Zkuste provést následující dotaz:
SELECT DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE-INTERVAL 1 DAY),INTERVAL 1 DAY),INTERVAL -1 MONTH)
Zde můžeme použít následující dotaz k prvnímu datu měsíce a poslednímu datu měsíce.
SELECT DATEADD(DAY,1,EOMONTH(Getdate(),-1)) as 'FD',Cast(Getdate()-1 as Date)
as 'LD'
Já osobně doporučil, že sql níže, protože když jsem se pokusit použít funkci data v podmínce klauzule, jeho zpomalit můj dotaz rychlost velmi mnoho.
každopádně to zkuste.
select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01')
Použil jsem GETDATE () jako datum pro práci, můžete jej nahradit datem, které potřebujete.
Zde je vysvětleno, jak to funguje: Nejdříve naformátujeme datum ve formátu zkrácení formátu YYYYMMDD ..., aby se zachovalo pouze 6 znaků nejvíce vlevo, aby se zachovala pouze část RRRRMM, a pak přidejte „01“ jako měsíc - a voila ! máte první den aktuálního měsíce.
SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth
BTW, výkon je na tom skvělý!
vyberte CONVERT (datum, DATEADD (dd, - (DATEPART (dd, getdate ()) - 1), getdate ()), 120)
Tato funkce vám poskytne datovou část počátečního data měsíce
V serveru SQL Server 2012
select getdate()-DATEPART(day, getdate())+1
select DATEADD(Month,1,getdate())-DATEPART(day, getdate())
Nesoutěžit s žádnou z těch velkých mozků zde, ale s jednoduchým návrhem poněkud odlišným od výše uvedené odpovědi.
select dateadd(day, -(datepart(day,@date)+1,@date)
První a poslední den aktuálního měsíce:
select dateadd(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay,
eomonth(getdate()) as LastDay
Líbí se mi použít FORMAT
, můžete zadat i čas
SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month
SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE())
.................................................. ...................
Pokud nechcete čas, pak jej převést na DATE nebo pokud chcete, aby čas na 0:00:00, Převést na DATE a pak zpět na DATETIME.
SELECT CONVERT (DATETIME,
CONVERT (DATE, DATEADD (DAY, -1 * (DAY(GETDATE()) - 1),
GETDATE())))
Změňte GETDATE () na požadované datum