TSQL 날짜 시간 필드에서 YYYY-MM-DD 형식으로 날짜를 얻는 방법은 무엇입니까?


259

SQL Server에서 날짜 YYYY-MM-DD형식을 어떻게 검색 합니까? SQL Server 2000 이상에서 작동하려면 이것이 필요합니다. SQL Server 에서이 작업을 수행하는 간단한 방법이 있습니까? 아니면 결과 집합을 검색 한 후 프로그래밍 방식으로 쉽게 변환 할 수 있습니까?

Microsoft Technet 에서 CAST 및 CONVERT 를 읽었 지만 원하는 형식이 나열되지 않고 날짜 형식을 변경하는 것은 옵션이 아닙니다.


126에 대한 BOL 설명은 약간 혼동됩니다 ( "T"에 대한 설명은 찾지 못했습니다).
nojetlag

"T"는 날짜와 시간을 구분합니다.
16:06의

답변:


428
SELECT CONVERT(char(10), GetDate(),126)

원하지 않는 시간 부분의 varchar chops의 크기를 제한합니다.


3
아니요, 그러나 일부 고객은 고정 길이에 문제가 있습니다.
gbn

54
이 게시물은 Google에서 YYYYMMDD로 변환하여 제공되므로 CONVERT (char (10), GetDate (), 112)
NealWalters

1
이것은 코드 112와 비교하여 위의 제안이 작동하지 않았습니다. 감사합니다 @NealWalters
AlexVPerl

4
출력 스타일의 정수 코드 목록 : msdn.microsoft.com/en-us/library/ms187928.aspx
Ben Fransen

코드 126은 YYYY-mm-dd 형식의 생년월일과 같은 날짜에 적합합니다. CONVERT (char (10), pat_dob, 126) as pat_dob
jjwdesign

118
SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM

SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy – 10/02/2008                  

SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd – 2008.10.02           

SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy

SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy

SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy

SELECT convert(varchar, getdate(), 106) -- dd mon yyyy

SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy

SELECT convert(varchar, getdate(), 108) -- hh:mm:ss

SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)

SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy

SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd

SELECT convert(varchar, getdate(), 112) -- yyyymmdd

SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm

SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm

SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm

1
'mm / dd / yyyy'대신 'm / d / yyyy'를 얻는 방법
user_az

이것은 가장 유용한 답변입니다.
다니엘

109

시작 SQL 서버 2012 (원래의 질문은 2000입니다) :

SELECT FORMAT(GetDate(), 'yyyy-MM-dd')


이것은 Dotnet 표준 형식을 사용하여 최근 SQL 버전에서 날짜 / 시간을 유연하게 조정할 수있는 방법입니다. 분과 구별하기 위해 월 MM을 대문자로 입력하십시오. 모든 날짜 시간 형식
jim birch

FORMAT은 CONVERT보다 43 배 느리게 실행됩니다. FORMAT을 절대 사용하지 않는 것이 좋습니다.
Jeff Moden

35

귀하가 사용하는 양식은 온라인 설명서에 나와 있습니다.

http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx

예를 들어 다음을 시도하십시오.

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)

4
기본값을 사용하면이 경우 시간 값을 얻습니다. 형식 120의 전체 형식은 'yyyy-mm-dd hh : mi : ss'입니다. 길이를 명시 적으로 선언하면 원래 메모- 'yyyy-mm-dd'에 지정한 형식으로 길이가 잘립니다.
DaveE

26

convert형식 지정자 120이 있는 함수는 "yyyy-MM-dd HH : mm : ss"형식을 제공하므로 날짜 부분 만 가져 오려면 길이를 10으로 제한하면됩니다.

convert(varchar(10), theDate, 120)

그러나 날짜 형식은 일반적으로 데이터베이스 나 비즈니스 계층이 아닌 프레젠테이션 계층에서 수행하는 것이 좋습니다. 데이터베이스에서 형식화 된 날짜를 리턴하면 계산을 수행해야하는 경우 클라이언트 코드가 날짜로 다시 구문 분석해야합니다.

C #의 예 :

theDate.ToString("yyyy-MM-dd")

1
왜 공감해야합니까? 잘못되었다고 생각하는 것이 무엇인지 설명하지 않으면 답변을 개선 할 수 없습니다.
Guffa

14

YYYYMMDD의 경우

select convert(varchar,getDate(),112)

SQLServer2008에서만 테스트했습니다.


7

다른 방법은 ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 

1
2 자리 mm / dd를 원하면 날짜를 왼쪽으로 채워야하는 경우 2012 년 8 월 3 일과 같이 1 자리 날짜가 생성됩니다. RIGHT ('00 '+ CONVERT (varchar, DATEPART (yyyy, @datetime)), 2) 예
MindStalker

7

시간 부분을 원하는 사람들에게 (내가 한) 다음 스 니펫이 도움이 될 수 있습니다.

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm
SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                              --example -- 2008-10-02T10:52:47.513

6
replace(convert(varchar, getdate(), 111), '/','-')

또한 "무엇을 잘라 내지 않고"속임수를 쓸 것입니다.


convert (varchar (10) ...) 버전과 관련된 "year 9999"버그를 피하기 위해이 버전을 선호합니다.
Francis Huang


5

캐스트 및 변환 링크에서 스타일 126을 사용하십시오.

CONVERT (varchar(10), DTvalue, 126)

시간이 잘립니다. yyyy-mm-dd로 요구 사항은 문자열 데이터 유형 및 날짜 시간이어야 함을 의미합니다.

솔직히 말하면, 당신이하지 않는 좋은 이유가 없다면 클라이언트에서 할 것입니다.


4

varchar나중에 다시 날짜 대신 날짜로 사용하려면 다시 변환하는 것을 잊지 마십시오.

select convert(datetime,CONVERT(char(10), GetDate(),126))

이것이 시스템 기본 형식으로 다시 변환되지 않습니까?
Ignas Vyšnia

3

위의 답변에서 가장 간단한 방법이 무시 / 생략 된 이유를 모르겠습니다.

SELECT FORMAT(GetDate(),'yyyy-MM-dd');--= 2020-01-02

SELECT FORMAT(GetDate(),'dd MMM yyyy HH:mm:ss');-- = 02 Jan 2020 08:08:08

나는 두 번째 언어를 선호합니다. 어떤 언어를 사용하든, 어떤 날짜인지 이해할 수 있습니다!

또한 SQL Server는 컴퓨터에 설정된 지역 형식에 관계없이 저장 절차로 보낼 때 항상 '이해'합니다. 나는 항상 1 년 (yyyy), 월 이름 (MMM) 및 24 시간 형식 (자본 HH)을 사용합니다. 내 프로그래밍에서 몇 시간 동안.


2

SELECT CONVERT(NVARCHAR(20), GETDATE(), 23)


1
왜 NVARCHAR (20)을 사용합니까? 거기에 특별한 캐릭터가있을 수 있습니까?
KM.

UNICODE를 사용하는 것을 가장합니다. 내 프로젝트의
이끼

2

사용할 수도 있습니다. 이것은 새로운 데이터 유형을 사용하는 것 DATE입니다. 모든 이전 버전에서 작동하지는 않지만 이후 버전에서 사용하기 위해 크게 단순화되었습니다.

SELECT CAST(getdate() AS DATE)
SELECT LEFT(CAST(getdate() AS DATE), 7)

1

나는 사용할 것이다 :

CONVERT(char(10),GETDATE(),126)

1
SELECT Code,Description FROM TABLE

-- This will Include only date part of 14th March 2010. Any date with date companents will not be considered.
WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate <= DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))

-- This will Include the whole day of 14th March 2010
--WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate < DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))

1

SQL Server 2008에서 다음을 수행 할 수 있습니다. CONVERT(date,getdate())


1

날짜를 슬래시로 구분하려면 이상한 일을 할 필요가없는 것 같습니다. 백 슬래시로 이스케이프 처리하면됩니다. 그렇지 않으면 점이 생깁니다.

SELECT FORMAT(GETDATE(),'yyyy\/MM');  

SQL Server 2016에서 테스트


성능을 테스트해야합니다. FORMAT은 일반적으로 복잡한 CONVERT보다 43 배 느립니다.
Jeff Moden

0

각 변환 / 캐스트 함수에 대해 CASE 문을 사용하면 항상 효과적입니다.

tableXXXXY를 테이블 이름으로 바꾸고 issueDate_dat를 해당 테이블의 날짜 시간 필드 이름으로 바꾸십시오.

SELECT  issueDate_dat, CONVERT(varchar, DATEPART(yyyy, issuedate_dat))  AS issueDateYYYY
, CASE WHEN (len(CONVERT(varchar, DATEPART(mm, issuedate_dat))) < 2) THEN '0' +CONVERT(varchar, DATEPART(mm, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(mm, issuedate_dat)) END AS  issueDateMM
, CASE WHEN (len(CONVERT(varchar, DATEPART(dd, issuedate_dat))) <2) THEN '0' +CONVERT(varchar, DATEPART(dd, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(dd, issuedate_dat)) END AS issueDateDD
FROM            tableXXXXY

이것이 도움이 되었기를 바랍니다. 채 버트.


0

이 솔루션은 간단하고 효과적입니다 (126도 포함).

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)

0

소스 날짜 형식이 모두 엉망인 경우 다음 행을 따라 시도하십시오.

select
convert(nvarchar(50),year(a.messedupDate))+'-'+
(case when len(convert(nvarchar(50),month(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),month(a.messedupDate))+'-' 
    else convert(nvarchar(50),month(a.messedupDate)) end)+
(case when len(convert(nvarchar(50),day(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),day(a.messedupDate))+'-'
    else convert(nvarchar(50),day(a.messedupDate)) end) 
from messytable a

0
 IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);

cmdGetPaymentStatement.Parameters.AddWithValue("@pStartDate", DateTime.Parse("22/12/2017", culture, System.Globalization.DateTimeStyles.AssumeLocal)).IsNullable = true;

위의 코드는 mm / dd / yyyy 형식으로 매개 변수에 저장 프로 시저를 제공하는 데 사용됩니다.
Raj Kumar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.