SQL에서 한 달의 첫 번째 날을 어떻게 선택할 수 있습니까?


308

주어진 datetime 변수의 첫 번째 요일을 선택하면됩니다.

이런 종류의 코드를 사용하는 것이 매우 쉽다는 것을 알고 있습니다.

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

그러나 이것은 매우 우아하지 않으며 아마도 그리 빠르지도 않습니다.

더 좋은 방법이 있습니까? SQL Server 2008을 사용하고 있습니다.

답변:


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


63
Martin Smith가 언급 한 버그는 정확성이 아니라 성능에만 영향을 줄 수 있습니다.
Olson.dev


34
궁금한 사람이 SELECT EOMONTH(@mydate) AS EndOfMonth있으면 달의 마지막 날을 줄 것입니다.
hallizh

3
명시된 카디널리티 추정 버그가 나에게 영향을 미치는지 여부를 어떻게 확인할 수 있습니까? 2010 년에 수정 된 것으로 표시되어 있습니다. 이는 SQL Server 2012 이상 만 안전하거나 2008 서버가 패치되었을 가능성이 있음을 의미합니까?
Jon

134

위의 모든 대답 외에도 소개 된 기능을 기반으로하는 방법 sql 2012

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


14

날짜 시간에 문자열 (예 : "5/1/2009")을 캐스팅하는 것이 확실히 더 읽기 쉽지만 우리는 한 달의 첫 번째를 반환하는 코드를 발견했습니다 ...

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

10

간단한 쿼리 :

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

6

아마 꽤 빠릅니다. 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


3

이것을 사용하십시오

  1. 서버 2012

    DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
  2. 서버 2012 이전

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

3

이번 달의 첫째 날과 마지막 날 :

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

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

정말 간단하고 우아한 솔루션이지만 변수에 지정된 경우 날짜의 시간 부분도 반환합니다.
kuklei

나는 이것을 작동시킬 수 없었다. 여분의 닫는 괄호 외에도이 오류가 발생 Operand type clash: date is incompatible with int합니다. -날짜에 연산자 를 사용하려고했기 때문 일까요?
Sam

성능면에서 얼마나 좋은지 모르겠지만 확실히 일을합니다.
salcoin

@ Sam, 간단한 산술 (+,-)이 날짜가 아닌 날짜 시간에 작동하기 때문에 충돌이 발생합니다.
darlove

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

그러나 OP는 매월 1 일을 찾고 있습니다. 마지막 날, EOMONTH ()를 사용할 수 있습니다. 2012
이래이


1

MySQL의 미래 Google 직원은 다음을 시도하십시오.

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

3
이것은 sql-server질문 date_sub이며 interval입니다 mysql.
OGHaza

좋아, 나는 응답을 편집했다. 나는 여전히 스레드와 관련이 있다고 생각합니다.
Ariel T

1

작업 날짜로 GETDATE ()를 사용했습니다. 필요한 날짜로 바꿀 수 있습니다.
작동 방식은 다음과 같습니다. 먼저 YYYYMMDD ... 형식으로 날짜를 형식화하고 YYYYMM 부분 만 유지하기 위해 가장 왼쪽에있는 6 자만 유지하고 잘린 다음 '01'을 월로 추가합니다. 현재 달의 첫 날이 있습니다.

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

BTW, 성능이 뛰어납니다!


1

오늘 이것을보고 SQL Server 2012 이상을 사용하는 경우 EOMONTH 기능이있어 작업을보다 쉽게 ​​수행 할 수 있습니다.

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

원하는 날짜 변수를 사용하여 GETDATE ()를 변경할 수 있습니다.


1

다음 달의 첫 번째 날짜와 마지막 날짜까지 아래 쿼리를 사용할 수 있습니다.

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

1

SQL Server 2012 이상을 사용하는 경우

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

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

-2는 지난 달의 첫날을 알려줍니다. 즉, getdate ()는 10/15/18입니다. 결과는 9/1/18입니다. -1로 변경하면 결과는 10/1/18이됩니다. 0은 다음 달의 시작일, 11/1/2018 등이 될 것입니다.

또는

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

1

다음 쿼리를 실행하십시오.

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


0

CONVERT (날짜, DATEADD (dd,-(DATEPART (dd, getdate ())-1), getdate ()), 120)를 선택하십시오.

이 기능은 시작 날짜의 날짜 부분을 제공합니다.


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

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

시간을 원하지 않으면 DATE로 변환하거나 0:00:00으로 시간을 변경하려면 DATE로 변환 한 다음 DATETIME으로 돌아갑니다.

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

GETDATE ()를 원하는 날짜로 변경하십시오.


0

조건 절에서 날짜 함수를 사용하려고하면 쿼리 속도가 크게 느려지므로 아래 SQL을 개인적으로 권장했습니다.

어쨌든 이것을 사용해보십시오.

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

0

여기서 위대한 마음과 경쟁하지 말고 위의 대답과 약간 다른 간단한 제안이 있습니다.

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

0

사용 FORMAT하고 싶습니다 , 심지어 시간을 지정할 수도 있습니다

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

0

Sql Server 2012에서는

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

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


0

여전히 답을 찾는 사람에게는 매력처럼 작동하며 데이트 추가를 없애줍니다. 타임 스탬프는 지정이 필요한 경우 선택 사항이지만 그 없이도 작동합니다.

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

0

SQL에서 매개 변수로 전달한 날짜의 첫 번째 날짜 및 마지막 날짜 가져 오기

     @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에서 수행하는 방법은 다음과 같습니다.

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

4
이것이 sql-server 응답이 아니라 MySQL에서만 작동하도록 지정하십시오.
kuklei

SQL Server의 경우 다음을 사용할 수 있습니다SELECT FORMAT(GETDATE(), 'yyyy-MM-01')
NASSER

숫자로 할 수 있고해야 할 일을하기 위해 날짜를 문자열로 형식화하도록 권장하지 마십시오. "숫자를 문자열로 형식화하고 마지막 두 자리를 제외한 모든 부분을 부분 문자열로
묶고
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.