it-swarm-eu.dev

Jak mohu vybrat první den v měsíci v SQL?

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.

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

Kromě výše uvedené odpovědi, způsob založený na funkci zavedené v 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

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

Jednoduchý dotaz:

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

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

To funguje také:

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

Použijte toto

  1. Pro Server 2012

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

-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))
1
Brian Widdoes

Budoucí googlery, na MySQL, zkuste toto:

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

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.

1
Ang Li

Pokud používáte SQL Server 2012 nebo vyšší;

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

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)

1
divya

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

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

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ý!

0
Eli

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

0
Tushar

V serveru SQL Server 2012

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

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

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

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
0
nicolai koroslev

Líbí se mi použít FORMAT, můžete zadat i čas

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

0
Sayka