포맷 - sql 날짜 형식 변환




SQL Server DateTime 데이터 형식에서 날짜 만 반환하는 방법 (20)

SELECT GETDATE()

반환 : 2008-09-22 15:24:13.790

시간 부분없이 날짜 부분을 원합니다 : 2008-09-22 00:00:00.000

어떻게해야합니까?


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

Format() 함수를 사용하십시오.

SQL 서버에는 이미 여러 가지 답변과 서식 유형이 있습니다. 그러나 대부분의 방법은 다소 모호하며 특정 날짜 형식과 관련하여 형식 유형 또는 함수의 숫자를 기억하기가 어려울 수 있습니다. 그래서 다음 버전의 SQL Server에는 더 나은 옵션이 있습니다.

FORMAT ( value, format [, culture ] )

문화 옵션은 시청자별로 날짜를 지정할 수 있으므로 매우 유용합니다.

d (작은 패턴의 경우)와 D (긴 패턴의 경우)를 기억해야합니다.

1. "d"- 짧은 날짜 패턴.

2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)

2. "D"- 긴 날짜 패턴.

2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)

쿼리의 예제 더보기.

DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 

SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';

US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
----------------  ----------------------------- ------------- -------------------------------------
10/1/2011         01/10/2011                    01.10.2011    2011/10/1

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011年10月1日

형식을 더 원하면 다음으로 가십시오.

  1. 표준 날짜 및 시간 형식 문자열
  2. 사용자 지정 날짜 및 시간 형식 문자열

DATEADD 및 DATEDIFF는 CONVERTing to varchar보다 좋습니다. 두 쿼리 모두 동일한 실행 계획을 가지고 있지만 실행 계획은 주로 데이터 액세스 전략에 대한 것이며 모든 부분을 수행하는 데 소요 된 CPU 시간과 관련된 암시 적 비용을 항상 드러내지는 않습니다. 두 쿼리가 수백만 행이있는 테이블에 대해 실행되는 경우 DateDiff를 사용하는 CPU 시간은 Convert CPU 시간의 1/3에 가까워 질 수 있습니다!

쿼리 실행 계획을 확인하려면 다음을 수행하십시오.

set showplan_text on
GO 

DATEADD 및 DATEDIFF는 모두 CONVERT_IMPLICIT를 실행합니다.

CONVERT 솔루션은 일부 경우 더 간단하고 쉽게 읽을 수 있지만 느립니다. datetime으로 다시 캐스트 할 필요가 없습니다 (이것은 서버에서 암시 적으로 수행됩니다). 정수 결과가 암시 적으로 다시 datetime으로 변환되기 때문에 DateAdd의 DateDiff 메소드에도 실제 필요가 없습니다.

SELECT CONVERT (varchar, MyDate, 101) FROM DATETable

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

SELECT DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

FLOOR ()를 @digi로 사용하면 DateDiff에 가까운 성능을 보일 수 있지만 datetime 데이터 유형을 float로 캐스팅하고 항상 원래 값을 반환하지는 않는 것이 좋습니다.

친구들을 기억하십시오 : 아무도 믿지 마십시오. 성능 통계를보고 직접 테스트 해보십시오!

결과를 테스트 할 때는주의하십시오. 클라이언트에 많은 행을 선택하면 계산을 수행하는 것보다 네트워크를 통해 행을 보내는 데 시간이 오래 걸리기 때문에 성능 차이가 숨겨집니다. 따라서 모든 행에 대한 작업이 서버에 의해 수행되지만 클라이언트에 전송 된 행 집합이 없는지 확인하십시오.

캐시 최적화가 쿼리에 영향을 미치는 경우에 대한 혼란이있는 것 같습니다. 동일한 일괄 처리 또는 별도의 일괄 처리에서 두 개의 쿼리를 실행해도 캐싱에 아무런 영향을 미치지 않습니다. 따라서 수동으로 캐시를 만료 시키거나 쿼리를 앞뒤로 여러 번 실행할 수 있습니다. 질의 # 2에 대한 최적화는 이후의 질의에도 영향을 미치므로 원하는 경우 실행 # 1을 버리십시오.

다음은 DateDiff가 varchar로 변환하는 것보다 훨씬 빠르다는 것을 증명하는 전체 테스트 스크립트 및 성능 결과 입니다.


SQL 2008 이상을 사용하는 경우

select cast(getdate() as date)

SQL Server 2000에서

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)

SQLServer2008에는 이제 시간 구성 요소가없는 날짜 만 포함하는 '날짜'데이터 형식이 있습니다. SQLServer 2008 이상을 사용하는 모든 사용자는 다음을 수행 할 수 있습니다.

SELECT CONVERT(date, GETDATE())

varchar 데이터 유형에서 결과가 필요하면 통과해야합니다.

SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26

이미 위에서 언급 한

날짜 및 시간 형식으로 결과가 필요한 경우 아래 쿼리 중 하나를 수행해야합니다.

1) OnlyDate로 SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111)) --2014-03-26 00 : 00 : 00.000

2) OnlyDate로 SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) --2014-03-26 00 : 00 : 00.000

삼)

 DECLARE  @OnlyDate DATETIME
   SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
   SELECT @OnlyDate AS OnlyDate

--2014-03-26 00 : 00 : 00.000


고대 MSSQL Server 7.0을 사용해도이 코드 (이 link 호의)는 내가 당시에 찾던 날짜 형식을 얻을 수있었습니다.

PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)

그것은 다음과 같은 결과를 산출했다 :

1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630

나는 언급되지 않은 다음을 선호한다.

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

또한 각 지역의 'datepart'는 아마 수학을하지만 로컬에 대해서는 신경 쓰지 않고 이중 변환을 수행합니다. 그래서 그것은 데이트 티프 방법보다 조금 느릴지도 모르지만 나에게는 훨씬 더 분명합니다. 특히 연중 무휴로 그룹화하고자 할 때 (하루를 1로 설정).


날짜 부분과 날짜 형식에 대해 다음을 사용할 수 있습니다.

DATENAME => 지정된 날짜의 지정된 datepart를 나타내는 문자열을 리턴합니다.

DATEADD => DATEPART() 함수는 년, 월, 일,시, 분 등 날짜 / 시간의 단일 부분을 반환하는 데 사용됩니다.

DATEPART => 지정된 날짜의 지정된 datepart를 나타내는 정수를 리턴합니다.

CONVERT() => CONVERT() 함수는 한 데이터 형식의 식을 다른 데이터 형식으로 변환하는 일반 함수입니다. CONVERT() 함수는 날짜 / 시간 데이터를 다른 형식으로 표시하는 데 사용할 수 있습니다.


날짜:

SELECT CONVERT(date, GETDATE())
SELECT CAST(GETDATE() as date)

시각:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)

열 또는 변수에 결과를 지정하는 경우 DATE 유형을 지정하면 변환이 내재적입니다.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

왜 당신은 DATE_FORMAT (your_datetiem_column, '% d- % m- % Y')를 사용하지 않습니까?

EX : select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

'%d-%m-%Y' 부분을 ​​다시 정렬하여 m, d 및 year의 순서를 변경할 수 있습니다.


이것은 모든 답변에서 빠졌으며, 가장 효율적이지만 작성하기 쉽고, 스타일이 필요하지 않으며, 복잡한 날짜 기능도 없습니다.

SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))

좋아, 내가 조금 늦었지만 :), 여기에 또 다른 해결책이 있습니다.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)

결과

2008-09-22 00:00:00.000

그리고 SQL Server 2012 이상을 사용하는 경우 FORMAT() 함수를 다음과 같이 사용할 수 있습니다.

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


SQL Server 2008 이상에서는 다음 날짜로 CONVERT 해야합니다.

SELECT CONVERT(date, getdate())

이전 버전에서는 다음을 수행 할 수 있습니다.

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

예를 들면

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

나에게 준다.

2008-09-22 00:00:00.000

장점 :

  • varchar <-> datetime 변환이 필요하지 않습니다.
  • locale 에 대해 생각할 필요가 없습니다.

날짜 형식으로 반환

CAST (주문일 AS 주문일)

위의 코드는 SQL Server 2010에서 작동합니다.

2012 년 12 월 12 일처럼 돌아갑니다.

SQL Server 2012의 경우 아래 코드를 사용하십시오.

CONVERT(VARCHAR(10), OrderDate , 111)

 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))




datetime