SQL'de bir ayın ilk gününü nasıl seçebilirim?


308

Sadece belirli bir datetime değişkeninin ayının ilk gününü seçmem gerekiyor.

Bu tür bir kod kullanarak yapmak oldukça kolay biliyorum:

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

Ama bu çok zarif değil ve muhtemelen çok hızlı değil.

Bunu yapmanın daha iyi bir yolu var mı? SQL Server 2008 kullanıyorum.

Yanıtlar:


604
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth


63
Martin Smith'in bahsettiği hatanın doğruluğu değil, performansı “etkileyebileceği” not edilmelidir.
Olson.dev


34
Merak eden biri SELECT EOMONTH(@mydate) AS EndOfMonthsize ayın son gününü verecektir.
hallizh

3
Belirtilen kardinalite tahmin hatasının beni etkileyip etkilemeyeceğini nasıl belirleyebilirim? Bu, 2010 yılında düzeltildi olarak işaretlenmiştir. Bu, yalnızca SQL Server 2012 ve daha yenisinin güvenli olduğu anlamına mı geliyor, yoksa bir 2008 sunucusunun yamalanmış olması mümkün mü?
Jon

134

Yukarıdaki tüm yanıtlara ek olarak, tanıtılan bir işleve dayalı bir yol sql 2012

SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)


14

Bir dizenin (yani "5/1/2009") datetime dökümü kesinlikle daha okunaklıdır, ancak ayın ilkini döndürecek bir süre önce kod bulduk ...

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

10

Basit Sorgu:

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

6

Muhtemelen oldukça hızlı. Neden bir sql işlevi olarak oluşturmuyorsunuz?

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

4

Bu da işe yarıyor:

    SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth

3

Lütfen bunu kullanın

  1. Server 2012 için

    DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
  2. Server 2012'den önce

    select  cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime)

3

Bu ayın ilk ve son günü:

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

2
SELECT @myDate - DAY(@myDate) + 1

Gerçekten basit ve zarif bir çözüm, ancak bunun değişkende belirtilmişse tarihin zaman bölümünü de döndürdüğünü unutmayın.
kuklei

Bunu çalıştıramadım. Ekstra ayraç yanında, bu hatayı alıyorum: Operand type clash: date is incompatible with int. Sanırım bunun nedeni -operatörü bir tarihte kullanmaya çalışıyorsunuz ?
Sam

Performans açısından ne kadar iyi olduğunu bilmiyorum, ama kesinlikle işi yapıyor.
salcoin

@Sam, bir çatışmanız var çünkü basit aritmetik (+, -) tarihlerde değil, tarihlerde çalışıyor.
19'da sevgilim

2
----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

Ancak OP ayın ilk gününü arıyor. Son gün için, sadece EOMONTH () kullanabilirsiniz
2012'den


1

MySQL'de gelecekteki Google çalışanları bunu deneyin:

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

3
Bu bir sql-serversoru date_subve intervalöyle mysql.
OGHaza

Güzel, nokta, yanıtı düzenledim. Ben hala iplik için alakalı olduğunu düşünüyorum.
Ariel T

1

GETDATE () işlevini çalışmak için tarih olarak kullandım, istediğiniz tarihle değiştirebilirsiniz.
Bunun nasıl çalıştığı aşağıdadır: Öncelikle YYYYMM bölümünü saklamak için tarihi yalnızca en soldaki 6 karakteri tutmak için kesilen YYYYMMDD ... biçiminde biçimlendiriyoruz ve sonra ay olarak '01' ekliyoruz - ve işte! bu ayın ilk günü var.

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

BTW, bu konuda performans harika!


1

Bugün buna bakıyorsanız ve SQL Server 2012 veya daha yenisini kullanıyorsanız, işleri kolaylaştıran EOMONTH işlevine sahipsiniz:

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

GETDATE () öğesini istediğiniz tarih değişkeniyle değiştirebilirsiniz.


1

Burada ayın ilk tarihi ve ayın son tarihi için aşağıdaki sorguyu kullanabiliriz.

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

1

SQL Server 2012 veya üstü kullanıyorsanız;

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

1
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(Getdate(),-2))

-2, geçen ayın ilk gününü alır. yani, getdate () 15/10 / 18'dir. Sonuçlarınız 1/1/18 olacaktır. -1 olarak değiştirin ve sonuçlarınız 10/1/18 olur. 0 gelecek ayın başlangıcı olacak, 11/1/2018 .. vb.

veya

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

1

Aşağıdaki sorguyu çalıştırmayı deneyin:

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


0

CONVERT (tarih, DATEADD (dd, - (DATEPART (dd, getdate ()) - 1), getdate ()), 120) öğesini seçin

Bu işlev size ayın başlangıç ​​tarihinin bir kısmını sağlar


0
SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE())

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

Zamanı istemiyorsanız, DATE tarihine dönüştürün veya 0:00:00 saatine çevirmek istiyorsanız, DATE diline dönüştürün ve DATETIME tarihine dönün.

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

GETDATE () öğesini istediğiniz tarihe değiştirin


0

Ben kişisel koşul aşağıdaki cümle işlevini kullanmaya çalıştığınızda aşağıdaki sql tavsiye, benim sorgu hızı çok yavaş.

neyse bunu denemek için çekinmeyin.

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

0

Buradaki büyük akıllardan herhangi biriyle rekabet etmek değil, ama yukarıdaki kabul edilen cevaptan biraz farklı basit bir öneri.

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

0

Kullanmayı seviyorum FORMAT, bir zaman bile belirleyebilirsiniz

SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month

0

Sql Server 2012'de,

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

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

0

Bu sorgu MySQL üzerinde çok iyi çalışmalıdır:

SELECT concat(left(curdate(),7),'-01') 

0

Hala bir cevap arayan herkes için, bu bir cazibe gibi çalışır ve herhangi bir dateadds ile ortadan kaldırır. Zaman damgası, belirtilmesi gerektiğinde isteğe bağlıdır, ancak aynı zamanda da çalışır.

SELECT left(convert(varchar, getdate(),23),7)+'-01 00:00:00'

0

SQL'de parametre olarak ilettiğimiz Tarihin İlk Tarihini ve Son Tarihini Alın

     @date DATETIME
    SELECT @date = GETDATE()
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@date)-1),@date),105) AS value,
    'First Day of Current Month' AS name
    UNION
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@date))),
    DATEADD(mm,1,@date)),105),
    'Last Day of Current Month'
    GO


      **OutPut**

12/01/2019  First Day of Current Month
12/31/2019  Last Day of Current Month

-3

MySQL'de bunu nasıl yapacağınız aşağıda açıklanmıştır:

  select DATE_FORMAT(NOW(), '%Y-%m-1')

4
Lütfen bunun sql-server yanıtı olmadığını, yalnızca MySQL üzerinde çalıştığını belirtin.
kuklei

SQL Server için aşağıdakileri kullanabilirsinizSELECT FORMAT(GETDATE(), 'yyyy-MM-01')
NASSER

İnsanları, yalnızca sayısal olarak yapılabilecek ve yapılması gereken bir şey yapmak için tarihleri ​​dizelere biçimlendirmeye teşvik etmeyin. "Bir sayıyı bir dizeye biçimlendirerek, son iki rakam hariç tüm alt dizeleri alt gruplara ayırarak ve bir '00' ile birleştirerek en yakın 100'e yuvarlayabilirsiniz"
Caius Jard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.