programing

SQL Server DateTime 데이터 유형에서 날짜만 반환하는 방법

oldcodes 2023. 4. 14. 22:04
반응형

SQL Server DateTime 데이터 유형에서 날짜만 반환하는 방법

SELECT GETDATE()

품::2008-09-22 15:24:13.790

그 날짜 을 시간 부분 싶다.2008-09-22 00:00:00.000

어떻게 구할 수 있죠?

참고: 이 답변은 원본이 반환됩니다.DATETIME ★★★★★★★★★★★★★★★★★」DATETIME2. true는 true입니다.DATE(SQL Server 2008 후를를를 ) 。BenR을 사용하다

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 변환 불필요
  • 로케일을 생각할 필요가 없다

SQL Server 2008에는 날짜만 포함된 날짜 데이터 유형이 있으며 시간 구성요소는 없습니다.SQL Server 2008 이후를 사용하는 모든 사용자는 다음을 수행할 수 있습니다.

SELECT CONVERT(date, GETDATE())

SQL 2008 이후를 사용하는 경우:

select cast(getdate() as date)

DATEADD와 DATIFF는 varchar로 변환하는 것보다 낫다.두 쿼리 모두 실행 계획은 동일하지만 실행 계획은 주로 데이터 액세스 전략에 관한 것이며 모든 작업을 수행하는 데 소요되는 CPU 시간과 관련된 암묵적인 비용을 항상 나타내는 것은 아닙니다.두 쿼리가 모두 수백만 개의 행이 있는 테이블에 대해 실행되는 경우 DateDiff를 사용하는 CPU 시간은 CPU 변환 시간의 1/3에 가까울 수 있습니다.

쿼리에 대한 실행 계획을 보려면:

set showplan_text on
GO 

DATE ADD와 DATIFF는 모두 CONVERT_를 실행합니다.암묵적

CONVERT 솔루션이 더 단순하고 읽기 쉽지만 더 느립니다.Date Time 에 캐스트 할 필요는 없습니다(이것은 서버에 의해서 암묵적으로 행해집니다).또한 DateDiff 메서드에서는 나중에 DateAdd가 실제로 필요하지 않습니다.이는 정수 결과도 암묵적으로 DateTime으로 변환되기 때문입니다.


SELECT CONVERT(varchar, MyDate, 101) FROM DatesTable

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

DatesTable에서 DateADD(d, 0, DATIFF(dd, 0, MyDate))를 선택합니다.

  |--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]))

@digi가 제안하는 바와 같이 FLOOR()을 사용하면 DateDiff에 가까운 퍼포먼스가 발생하지만 DateTime 데이터 유형을 플로트하여 원래 값을 반환하는 것은 권장되지 않습니다.

여러분, 기억하세요.아무도 믿지 마세요.성능 통계를 보고 직접 테스트해 보십시오!

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

캐시 최적화가 쿼리에 영향을 미치는 시기에 대해 혼동하는 사람도 있는 것 같습니다.두 개의 쿼리를 동일한 배치 또는 개별 배치로 실행해도 캐싱에는 영향을 주지 않습니다.따라서 캐시를 수동으로 만료하거나 쿼리를 여러 번 실행할 수 있습니다.쿼리 #2에 대한 최적화는 후속 쿼리에도 영향을 미치므로 필요에 따라 실행 #1을 폐기하십시오.

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

이것을 시험해 보세요.

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

은 현재 을 의의음음음음음음음음음음음음음음음음음 to to to to로 합니다.YYYY/MM/DD원하는 형식을 선택하려면 이 링크를 참조하십시오.

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

날짜 형식으로 반환하는 경우

CAST(OrderDate AS 날짜)

위의 코드는 sql server 2010에서 사용할 수 있습니다.

2013년 12월 12일에 반환될 예정입니다.

SQL Server 2012의 경우 다음 코드를 사용합니다.

CONVERT(VARCHAR(10), OrderDate , 111)

다음 작업을 수행합니다.

SELECT CAST(date_variable AS date)

또는 Postgre를 사용하여SQL:

SELECT date_variable::date

이것은 타이프캐스팅이라고 불립니다!

.CONVERT이치노이치노

SQL Server 2000에서의 날짜와 시각 조작

캐스트 및 변환

변환 함수를 사용하기 위한 구문은 다음과 같습니다.

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 

varchar그러다,,그러세요.

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

이미 위에서 언급한 바와 같습니다.

날짜 및 시간 형식의 결과가 필요한 경우 아래 쿼리 중 하나를 사용하십시오.

  1. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate 
    

    2014-03-26 00:00:00.000

  2. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate 
    

    2014-03-26 00:00:00.000

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

    2014-03-26 00:00:00.000

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

기능을 사용합니다.

SQL Server에 대한 응답 및 형식 유형이 이미 여러 개 있습니다.그러나 대부분의 방법은 다소 애매하고 특정 날짜 형식에 대한 형식 유형이나 함수의 숫자를 기억하는 것이 어려울 수 있습니다.따라서 SQL Server의 다음 버전에는 더 나은 옵션이 있습니다.

FORMAT ( value, format [, culture ] )

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. 사용자 지정 날짜 및 시간 형식 문자열
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

FLOOR() 사용 - 시간 부분을 잘라냅니다.

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

표시된 결과를 얻기 위해 다음 명령을 사용합니다.

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

나는 그것이 유용하다고 생각한다.

CONVERT를 사용하여 원래 질문에서와 동일한 출력(yyy-mm-ddd)을 얻으려면 다음과 같이 하십시오.CONVERT(varchar(10),[SourceDate as dateTime],121)앞의 커플과 같은 코드로 응답하지만 대시 포함 yyy-mm-dd로 변환하는 코드는 121입니다.

잠시 설명하자면, 이러한 포맷은 데이터 계층에 속하지 않기 때문에 실제 날짜 부분 데이터 유형이 도입되는 SQL Server 2008까지 오버헤드가 높은 '트릭'이 없었다면 불가능했을 것입니다.데이터 계층에서 이러한 변환을 수행하는 것은 DBMS에 막대한 오버헤드를 초래하지만, 더 중요한 것은 이러한 작업을 수행하는 순간 기본적으로 메모리 내에서 고립된 데이터가 생성되고 그 후 프로그램으로 돌아갑니다.되돌리지 않고 다른 3NF+ 열에 다시 넣거나 입력한 항목과 비교할 수 없습니다. 따라서 오류 발생 지점과 관계 참조 제거만 수행되었습니다.

항상 dateTime 데이터 유형을 호출 프로그램으로 되돌리고 프레젠테이션 계층에서 필요한 조정을 수행해야 합니다.발신자에게 반환하기 전에 변환하는 즉시 응용 프로그램에서 참조 무결성에 대한 모든 희망이 사라집니다.이렇게 하면 수동 복귀를 하지 않는 한 UPDATE 또는 DELETE 조작을 방지할 수 있습니다.수동으로 복귀하지 않으면 데이터가 다시 휴먼/코드/그렘린 에러에 노출됩니다.

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

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

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

Edit: 첫 번째 두 가지 방법은 기본적으로 동일하며 out은 varchar로 변환하는 방법을 수행합니다.

결과를 열 또는 변수에 할당하는 경우 DATE 유형을 지정하면 변환이 암묵적으로 이루어집니다.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

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

날짜:

SELECT CONVERT(날짜, GETDATE())CAST(GETDATE)를 날짜로 선택합니다.

시간:

SELECT CONVERT(시간, GETDATE(), 114)시간으로 CAST(GETDATE)를 선택합니다.

구문:

SELECT CONVERT (data_type(length)),Date, DateFormatCode)

예:

Select CONVERT(varchar,GETDATE(),1) as [MM/DD/YY]
Select CONVERT(varchar,GETDATE(),2) as [YY.MM.DD]

날짜 관련 모든 날짜 형식 코드:

DateFormatCode  Format
1       [MM/DD/YY]
2       [YY.MM.DD]
3       [DD/MM/YY]
4       [DD.MM.YY]
5       [DD-MM-YY]
6       [DD MMM YY]
7       [MMM DD,YY]
10      [MM-DD-YY]
11      [YY/MM/DD]
12      [YYMMDD]
23      [yyyy-mm-dd]
101     [MM/DD/YYYY]
102     [YYYY.MM.DD]
103     [DD/MM/YYYY]
104     [DD/MM/YYYY]
105     [DD/MM/YYYY]
106     [DD MMM YYYY]
107     [MMM DD,YYYY]
110     [MM-DD-YYYY]
111     [YYYY/MM/DD]
112     [YYYYMMDD]

간단하게 다음과 같이 할 수 있습니다.

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

또는 다음과 같이 합니다.

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

결과:

Date Part Only
--------------
2013-07-14

이 경우 날짜만 다음 쿼리를 실행합니다.

CONVERT(VARCHAR(10), getdate(), 111)여기에 이미지 설명 입력를 선택합니다.

당신 경우엔 이게 통할 것 같아요

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

네, 조금 늦었지만:) 또 다른 해결책이 있습니다.

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

결과

2008-09-22 00:00:00.000

Server 2012를 사용할 수 .FORMAT()합니다.

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

SQL SERVER 2012부터는 다음을 수행할 수 있습니다.

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')

오래된 MSSQL Server 7.0을 사용하더라도 다음 코드( 링크의 정보)를 통해 원하는 날짜 형식을 얻을 수 있었습니다.

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

DATE_FORMAT( your_datetiem_column, '%d-%m-%Y')를 사용하지 않으시겠습니까?

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

d, d, ㄴ 것 같다를 붙여서 m, d, 수 있습니다.'%d-%m-%Y' 교환

이게 오래됐다는 건 알지만 누가 이런 식으로 말했는지 모르겠어요.제가 알기로는 이게 ANSI 규격이에요.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Microsoft도 ANSI 표준 CURRENT_DATE 변수를 지원할 수 있으면 좋겠습니다.

저는 언급되지 않은 다음 사항을 선호합니다.

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

또한 로컬이나 이중 변환은 신경 쓰지 않습니다. 단, 각 '날짜 부분'은 아마 계산을 할 것입니다.따라서 날짜 지정 방법보다 조금 느릴 수 있지만, 나에게는 훨씬 더 명확합니다.특히 연월별로 그룹화하고 싶은 경우(날짜를 1로 설정).

언급URL : https://stackoverflow.com/questions/113045/how-to-return-only-the-date-from-a-sql-server-datetime-datatype

반응형