올해의 첫 번째와 마지막 날짜를 얻는 방법은 무엇입니까?


110

SQL Server 2000을 사용하여 올해의 첫 번째 날짜와 마지막 날짜를 어떻게 알 수 있습니까?

예상 출력 :

01/01/201231/12/2012

답변:


237
SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear

위의 쿼리는 12 월 31 일 초 자정의 datetime 값을 제공합니다. 이는 연중 마지막 순간보다 약 24 시간 부족한 것입니다. 12 월 31 일에 발생할 수있는 시간을 포함하려면 비교를 통해 다음 해의 첫 번째 시간과 비교해야합니다 <. 또는 현재 연도의 마지막 몇 밀리 초와 비교할 수 있지만 DATETIME이 아닌 다른 항목 (예 : DATETIME2)을 사용하는 경우 여전히 공백이 남습니다.

SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
   DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear

기술 세부 정보

이것은 1900 년 이후의 연도 수를 알아 낸 DATEDIFF(yy, 0, GETDATE())다음 0 = 1900 년 1 월 1 일 날짜에 추가하여 작동 GETDATE()합니다. DATEDIFF(...)함수를 다음 으로 대체하여 부분 또는 임의의 연도를 대체하여 임의 의 날짜에 대해 작동하도록 변경할 수 있습니다. "년-1900."

 SELECT
   DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
   DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015

13

여기에 아주 간단한 방법이 있습니다.

SELECT DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS 'First Day of Current Year';
SELECT DATEFROMPARTS(YEAR(GETDATE()), 12, 31) AS 'End of Current Year';

섹시하지는 않지만 작동합니다.


1
Sql Server 2012부터 만 사용할 수 있습니다.
Lukas

12

DATEPART함수를 사용하여 얻은 현재 날짜에서 현재 연도를 얻을 수 있습니다.getUTCDate()

SELECT 
    '01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())), 
    '31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))

1
이것은 날짜가 아닌 문자열을 출력합니다. 그것이 정말로 필요한 것이라면 예,하지만 둘 중 하나를 사용할 수 있다면 날짜를 날짜로 유지하고 문자열로 사용하지 마십시오.
Jamie F

2
동의하지 않습니다. OP는 지정하지 않았으며 SQL 서버에 설정된 데이터 형식은 '01 / 01 / 2012 '대신'2012-01-01 12:13:14 '와 같은 것을 반환 할 수 있습니다.
RandyMorris

1
@RandyMorris, 동의합니다, OP는 그가 DATETIME문자열 대신 얻을 수 있는지 묻고 있었고 분명히 질문에 따라 예상되는 출력과 일치하지 않을 수 있습니다.
Vikdor

1
모호한 날짜 형식 을 사용하는 이유는 무엇입니까 (그리고 답변의 문자열이 주석의 형식과 일치하지 않음)? yyyyMMdd모호하지 않습니다.
Damien_The_Unbeliever

1
@Damien_The_Unbeliever, 응답의 쿼리는 질문에 따라 예상 출력과 일치하는 것입니다. DATETIME에 대한 주석은 문자열 대신 날짜를 가져 오는 것에 대한 OP의 주석에 대한 응답입니다. 대답은이 논의를 반영하지 않습니다.
Vikdor

7

간단히 작성하십시오.

select convert (date,DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE()),0))

해당 연도의 시작일.

select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))  

4

매년 첫 번째 날짜를 첫 번째 날짜로하고 31 일을 마지막 날짜로 지정해야합니다. 예를 들어 다음과 같이 연도를 해당 날짜와 월에 첨부하면됩니다.

 SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
 '12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]

1
프로그래머가 시간에 대해 믿고 있는 많은 허위 가 있기 때문에 이것은 반드시 사실이 아닙니다 .
krillgar

아무도 이것이 작동하지 않을 때의 예를 들어 줄 수 있습니까?
slayernoah

@slayernoah 서버의 현지화 설정에 따라 가끔 오류가 발생한다고 생각합니다.
Jamie F

3

그해의 첫날과 마지막 날을 얻으려면 CONCAT함수를 사용할 수 있습니다 . 결과 값은 모든 유형으로 캐스트 될 수 있습니다.

CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear

연도는 나를 위해 작동하지 않지만 date_part는 작동합니다. start_year_date : = CONCAT (date_part ( 'Y', start_date_p) :: int :: text, '-01-01') :: date;
bormat

1

올해의 시작일 :

SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())

올해 종료일 :

SELECT DATEADD(DD,-1,DATEADD(YY,DATEDIFF(YY,0,GETDATE())+1,0))

1

다른 방법 : (SQL Server 2012 이후)

SELECT
    DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
    DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay

0

다음을 확인하십시오.

select convert(varchar(12),(DateAdd(month,(Month(getdate())-1) * -1, DateAdd(Day,(Day(getdate())-1) * -1,getdate()))),103) as StartYear,
       convert(varchar(12),DateAdd(month,12 - Month(getdate()), DateAdd(Day,(31 - Day(getdate())),getdate())),103) as EndYear


0
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)

코드를 설명해야합니다. 코드 덤프는 종종 다운 보팅되며 삭제 될 수 있습니다.
Bugs

0

주어진 연도 동안 모든 작업을 수행하는 데 관심이있는 것 같습니다. 실제로 이런 경우 다음 과 같이 YEAR () 함수 를 사용하는 것이 좋습니다 .

SELECT * FROM `table` WHERE YEAR(date_column) = '2012';

DAY ()MONTH ()도 마찬가지 입니다. MySQL / MariaDB 변형에도 사용할 수 있으며 SQL Server 2008에 도입되었습니다 (특정 2000에는 해당되지 않음).


-1
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31') 
from dual

이것은 PL-SQL을위한 것이므로 SQL Server 2000에 게시되어 있으므로 T-SQL을 사용해야합니다. To_Date 및 Sysdate가 T-SQL에 존재하지 않음
Andrew Failor 2018

-1

Microsoft SQL Server (T-SQL)에서는 다음과 같이 수행 할 수 있습니다.

--beginning of year
select '01/01/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))

--end of year
select '12/31/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))

CURRENT_TIMESTAMP- 쿼리 실행시 SQL Server 날짜를 반환합니다.

YEAR- 현재 타임 스탬프의 연도 부분을 가져옵니다.

STR , LTRIM- 이 두 함수가 적용되어이를 원하는 접두사와 연결할 수있는 varchar로 변환 할 수 있습니다 (이 경우 연도의 첫 번째 날짜 또는 연도의 마지막 날짜). 어떤 이유로 든 YEAR 함수에 의해 생성 된 결과 에는 접두사 공백이 있습니다. 이를 수정하기 위해 왼쪽 트림 인 LTRIM 기능을 사용합니다 .


-1

1 월 1 일에 도달하면 여전히 작년 날짜 일 수 있습니다.

select
convert(date, DATEADD(yy, DATEDIFF(yy, 0,  DATEadd(day, -1,getdate())), 0), 103 ) AS StartOfYear,
convert(date, DATEADD(yy, DATEDIFF(yy, 0, DATEDIFF(day, -1,getdate()))+1, -1), 103 )AS EndOfYear

-2

이 시도:

DATE_FORMAT(NOW(),'01/01/%Y')
DATE_FORMAT(NOW(),'31/12/%Y')

Microsoft SQL Server. Msg 195, Level 15, State 10, Line 1 'NOW' is not a recognized function name.
jumxozizi

이 답변은 MySQL 함수를 사용합니다 (날짜를 내 애완 동물 중 하나 인 문자열로 변환합니다).
Álvaro González

-3

--- Lalmuni 데모 ---

create table Users
(
userid int,date_of_birth date
)

--- 값 삽입 ---

insert into Users values(4,'9/10/1991')

select DATEDIFF(year,date_of_birth, getdate()) - (CASE WHEN (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()),date_of_birth)) > getdate() THEN 1 ELSE 0 END) as Years, 
MONTH(getdate() - (DATEADD(year, DATEDIFF(year, date_of_birth, getdate()), date_of_birth))) - 1 as Months, 
DAY(getdate() - (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()), date_of_birth))) - 1 as Days,
from users
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.