복붙노트

[SQL] SQL 서버에서 날짜의 제거 시간 부분에 가장 좋은 방법

SQL

SQL 서버에서 날짜의 제거 시간 부분에 가장 좋은 방법

SQL Server에서 날짜 필드에서 시간 부분을 제거 할 때 어떤 방법이 가장 좋은 성능을 제공합니다?

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

또는

b) select cast(convert(char(11), getdate(), 113) as datetime)

두 번째 방법은 몇 가지 더 어느 쪽이든 바이트하지만 그 변환의 속도와 같은 중요하지 않을 수도 있습니다 보내 않습니다.

두도 매우 빠른 것으로 나타납니다,하지만 수백 - - 수천 이상의 행을 처리 할 때 속도에 차이가있을 수 있습니다?

또한, SQL에서 날짜의 시간 부분 제거하는 더 나은 방법이있을 가능성이?

해결법

  1. ==============================

    1.엄밀히 방법 A 집중적 최소한의 자원은 다음과 같습니다

    엄밀히 방법 A 집중적 최소한의 자원은 다음과 같습니다

    a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
    

    날짜 + 시간과 날짜를 얻기 위해 SQL Server의 가장 효율적인 방법 : 자신의 손에 너무 많은 시간을 어떤 사람으로 만 개 행이 같은 전체 기간 동안 집중적으로 입증 된 적은 CPU?

    나도 비슷한 결과와 유사한 테스트 다른 곳을 보았다.

    나는 DATEADD / DATEDIFF 때문에 선호 :

    [편집] 2011 년 10월

    SQL 서버 2008+의 경우, 현재까지 즉, CAST (날짜 AS GETDATE ()를) CAST 수 있습니다. 시간은 제거하지 할 수 있도록하거나 날짜 데이터 유형을 사용합니다.

    [편집] 2012 년 월

    SQL 서버의 둥근 시간 또는 날짜 숫자로 계산해야합니다 : A는이게 얼마나 유연한의 예를했습니다

    편집 : 2012 년 5 월호

    WHERE 절에서 이것을 사용하지 마십시오 등 생각하지 않고 : 열 무효화 인덱스 사용에 함수 나 CAST를 추가. 참조 번호 2 : 여기 http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/

    자,이 올바르게 최신 CAST를 관리 나중에 SQL 서버 최적화 버전의 예를 가지고 있지만, 일반적으로는 나쁜 생각합니다 ...

    편집 9 월 2018 datetime2에 대한

    DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
    DECLARE @datetime2epoch datetime2 = '19000101'
    
    select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)
    
  2. ==============================

    2.SQL Server 2008에서는, 당신은 사용할 수 있습니다 :

    SQL Server 2008에서는, 당신은 사용할 수 있습니다 :

    CONVERT(DATE, getdate(), 101)
    
  3. ==============================

    3.중은 - 물론 이것은 옛 스레드이지만 완료 할 수 있습니다.

    중은 - 물론 이것은 옛 스레드이지만 완료 할 수 있습니다.

    당신은 간단하게 할 수 있도록 SQL 2008에서 당신은 날짜 데이터 유형을 사용할 수 있습니다 :

    SELECT CONVERT(DATE,GETDATE())
    
  4. ==============================

    4.

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

    ... 아래의 코멘트를 좋은 솔루션은 아닙니다.

    나는이 대답을 삭제 것입니다,하지만 난 그게 좋은 아이디어는 여전히 유용하지 이유의 덧글 '설명을 생각하기 때문에 나는 카운터 - 예를 여기에두고 있습니다.

  5. ==============================

    5.SQL Server 2008에서 날짜 datetype (또한 TIME 데이터 타입)가있다.

    SQL Server 2008에서 날짜 datetype (또한 TIME 데이터 타입)가있다.

    CAST(GetDate() as DATE)
    

    또는

    declare @Dt as DATE = GetDate()
    
  6. ==============================

    6.여기에 또 다른 대답은 또 다른 중복 질문에서이다 :

    여기에 또 다른 대답은 또 다른 중복 질문에서이다 :

    SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime) 
    

    약간 빠른 DATEADD 방법보다이 매직 넘버 방법을 수행한다. (그것은 ~ 10 % 모양)

    만 기록을 몇 차례에 CPU 시간 :

    DATEADD   MAGIC FLOAT
    500       453
    453       360
    375       375
    406       360
    

    그러나이 숫자가 매우 빠른 이미 있기 때문에 아마도 무관 있습니다. 내가 10 만 이상의 기록 세트를 가지고하지 않는 한, 나는 심지어 CPU 시간 제로 이상 읽을 수 없었다.

    DateAdd 함수는이 목적을 위해 의미가 더욱 견고된다는 사실을 고려할 때, 나는 DateAdd 함수를 사용하여 말하고 싶지만.

  7. ==============================

    7.

    SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)
    
  8. ==============================

    8.나는 정말 좋아한다:

    나는 정말 좋아한다:

    [date] = CONVERT(VARCHAR(10), GETDATE(), 120)
    

    120 형식 코드는 ISO 8601 표준에 날짜를 강요합니다 :

    'YYYY-MM-DD' or '2017-01-09'
    

    아주 쉽게 dplyr (R)와 팬더 (파이썬)에서 사용하기!

  9. ==============================

    9.조심!

    조심!

    방법 a)와 b)는 항상 동일한 출력을하지 않습니다!

    select DATEADD(dd, DATEDIFF(dd, 0, '2013-12-31 23:59:59.999'), 0)
    

    출력 : 2014년 1월 1일 00 : 00 : 00.000

    select cast(convert(char(11), '2013-12-31 23:59:59.999', 113) as datetime)
    

    출력 : 2013년 12월 31일 00 : 00 : 00.000

    (MS SQL 서버에서 테스트 2005 년과 2008 R2)

    편집 : 당신이 테이블에서 날짜 값을 읽으면 아담의 코멘트에 따르면, 이런 일이 수는 없지만, 당신은 문자로 당신의 날짜 값을 제공하는 경우에 발생할 수 있습니다 (예 : ADO.NET을 통해라는 저장 프로 시저의 매개 변수로).

  10. ==============================

    10.처음에 삽입 / 업데이트에 스트립 시간. 온 - 더 - 플라이 전환에 관해서는, 아무것도 maintanability 현명한 사용자 정의 함수를 이길 수 있습니다 :

    처음에 삽입 / 업데이트에 스트립 시간. 온 - 더 - 플라이 전환에 관해서는, 아무것도 maintanability 현명한 사용자 정의 함수를 이길 수 있습니다 :

    select date_only(dd)
    

    date_only의 구현은 같은 것을 당신이 될 수 있습니다 - 멀리 추상화있어 지금과 코드를 호출하면 훨씬 청소기입니다.

  11. ==============================

    11.이 질문을 참조하십시오 : 어떻게 SQL Server에서 날짜를자를 수 있습니다?

    이 질문을 참조하십시오 : 어떻게 SQL Server에서 날짜를자를 수 있습니다?

    무슨 일이 있어도, 문자열 방법을 사용하지 마십시오. 즉 당신이 그것을 할 수있는 최악의 방법에 관하여이다.

  12. ==============================

    12.이미 대답하지만 병이 너무 거기에이 밖으로 던져 ... 이 suposedly도 잘 예비 적 있지만 (날짜 인) 플로트에서 (이 저장 시간) 소수점을 버리고 오직 정수 부분을 반환하여 작동

    이미 대답하지만 병이 너무 거기에이 밖으로 던져 ... 이 suposedly도 잘 예비 적 있지만 (날짜 인) 플로트에서 (이 저장 시간) 소수점을 버리고 오직 정수 부분을 반환하여 작동

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

    나는이 솔루션을 발견 두 번째는 ... 나는 떨어져이 코드를 잡고

  13. ==============================

    13.

    CAST(round(cast(getdate()as real),0,1) AS datetime)
    

    이 방법은 문자열 함수를 사용하지 않습니다. 날짜는 기본적으로 하루의 일부분이다 소수점 전에 자리와 실제 데이터 타입이다.

    이 I 추측은 훨씬 더 빨리보다됩니다.

  14. ==============================

    14.나를 위해 아래의 코드는 항상 승자입니다 :

    나를 위해 아래의 코드는 항상 승자입니다 :

    SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT,GETDATE())));
    
  15. ==============================

    15.선택 CONVERT (CHAR (10)에 GetDate (), 126)

    선택 CONVERT (CHAR (10)에 GetDate (), 126)

  16. ==============================

    16.나는 당신이 의미하는 생각    캐스트 (날짜 등의 float로서 층 (캐스트 (GETDATE ())))

    나는 당신이 의미하는 생각    캐스트 (날짜 등의 float로서 층 (캐스트 (GETDATE ())))

    실제는 32 비트이며, 몇 가지 정보를 잃을 수 있습니다

    이것은 가장 빠른 캐스팅 (날짜뿐만 아니라 주조 INT (GETDATE () + X-0.5))

    ...하지만 단지 약 10 % 빠른 (0.49에 대한 마이크로 CPU 대 0.58)

    이것은 권장, 그리고 지금 내 테스트에서 같은 시간이 소요 : DATEADD (DD, DATEDIFF (DD, 0, GETDATE ()), 0)

    SQL 2008에서 SQL CLR 기능은 간단한 SQL UDF 대 SQL CLR 기능에 대한 훨씬 낮은 함수 호출 오버 헤드를 나타내는 약 5 배 빠른 6.5 microsections 대 1.35 마이크로 초에서 일 것 SQL 함수를 사용하는 것보다.

    SQL 2005에서 SQL CLR 기능이 16 배 빠른 속도로, 내 테스트 당이 느린 기능 대입니다 :

    create function dateonly (  @dt datetime )
    returns datetime
    as
    begin
    return cast(floor(cast(@dt as float))as int)
    end
    
  17. ==============================

    17.어떻게 날짜로 선택 캐스트 (날짜로 캐스트 my_datetime_field))에 대한? 또한이 00:00 설정된 시간과 같은 날짜에 결과를하지만, 텍스트에 대한 변환을 방지하고 어떤 명시 적 숫자 반올림을 방지 할 수 있습니다.

    어떻게 날짜로 선택 캐스트 (날짜로 캐스트 my_datetime_field))에 대한? 또한이 00:00 설정된 시간과 같은 날짜에 결과를하지만, 텍스트에 대한 변환을 방지하고 어떤 명시 적 숫자 반올림을 방지 할 수 있습니다.

  18. ==============================

    18.난 당신이 시간을자를 수있는 가장 빠른 방법입니다 TSQL 엄격하게 고수 경우 생각 :

    난 당신이 시간을자를 수있는 가장 빠른 방법입니다 TSQL 엄격하게 고수 경우 생각 :

     select convert(datetime,convert(int,convert(float,[Modified])))
    

    나는 빨리 DateAdd 함수 방법보다 5 %에 ​​대해 수 있도록이 절단 방법을 발견했다. 그리고이 쉽게 이런 가장 가까운 날에 라운드를 수정할 수 있습니다 :

    select convert(datetime,ROUND(convert(float,[Modified]),0))
    
  19. ==============================

    19.저는 여기에 SQL Server에 대한 날짜의 일부를 제거하는 기능을했다. 용법:

    저는 여기에 SQL Server에 대한 날짜의 일부를 제거하는 기능을했다. 용법:

    생성 함수 dbo.uf_RoundDateTime (날짜 등 @dt, 문자 등 @part)     반환 날짜 같이 시작     CHARINDEX (@part 'smhd', 0) 0을 반환 @dt = 경우;     (캐스트를 반환         케이스 @part             '의'는 다음 변환 할 때 (VARCHAR (19), @dt, 126)             나타나면 'm'변환 (VARCHAR (17) @dt 126) + 00             나타나면 "H"변환 (VARCHAR (14) @dt 126) + 00 : 00             나타나면 'D'로 변환 (VARCHAR (14) @dt 112)        날짜 월말) 종료

  20. ==============================

    20.위의 조치가 효과가없는 경우 이런 경우에 사람이 버전의 몇 가지 있기 때문에 여기에베이스 버전에서 찾고

    위의 조치가 효과가없는 경우 이런 경우에 사람이 버전의 몇 가지 있기 때문에 여기에베이스 버전에서 찾고

    CAST(CONVERT(DATE,GETDATE(),103) AS DATETIME)
    
  21. ==============================

    21.가능하면,이 같은 특별한 것을 위해, 나는 CLR 기능을 사용하려면.

    가능하면,이 같은 특별한 것을 위해, 나는 CLR 기능을 사용하려면.

    이 경우 :

    [Microsoft.SqlServer.Server.SqlFunction]
        public static SqlDateTime DateOnly(SqlDateTime input)
        {
            if (!input.IsNull)
            {
                SqlDateTime dt = new SqlDateTime(input.Value.Year, input.Value.Month, input.Value.Day, 0, 0, 0);
    
                return dt;
            }
            else
                return SqlDateTime.Null;
        }
    
  22. ==============================

    22.SQL 서버 2005 (이하 버전)를 처리하지만, 사용하여 UDF의 특정 단점이 있다는 것을 주목해야한다 만약 내가 개인적으로, 거의 항상 조항 (아래 참조 WHERE에 적용 특히,이에 대한 사용자 정의 기능을 사용하여 자세한 내용은이 답변에 댓글). SQL 서버 2008 이상을 사용하는 경우 - 아래를 참조하십시오.

    SQL 서버 2005 (이하 버전)를 처리하지만, 사용하여 UDF의 특정 단점이 있다는 것을 주목해야한다 만약 내가 개인적으로, 거의 항상 조항 (아래 참조 WHERE에 적용 특히,이에 대한 사용자 정의 기능을 사용하여 자세한 내용은이 답변에 댓글). SQL 서버 2008 이상을 사용하는 경우 - 아래를 참조하십시오.

    내가 조만간 그들을 필요 해요 99 % 기회가 알고 있기 때문에 사실, 내가 만드는 것이 대부분의 데이터베이스, 나는 시작에 가까운 오른쪽이 UDF의를 추가합니다.

    ( "날짜는"하나는 지금까지 가장 두 가지의 사용하지만) 나는 "날짜 전용"에 대한 & "유일한 시간"을 만듭니다.

    다음 날짜 관련 UDF의 다양한에 대한 몇 가지 링크입니다 :

    필수 SQL 서버 날짜, 시간 및 날짜 시간 함수 취득 날짜 만 기능

    마지막 링크 쇼는 더 적은 날짜 필드의 일부만 날짜를 얻는 3 개 가지 방법보다는 각 접근 방식의 몇 가지 장점과 단점을 언급 없다.

    UDF를 사용하는 경우, 쿼리의 의지 크게 방해한다 성능으로 쿼리에 WHERE 절의 일환으로 UDF를 사용하여 피하려고한다는 것을 주목해야한다. 이에 대한 가장 큰 이유는 WHERE 절에서 UDF를 사용하여 비 스 SARGable로 그 절을 렌더링하는 인 SQL 서버가 더 이상 쿼리 실행 속도를 개선하기 위해이 절을 사용하여 인덱스를 사용할 수 있다는 것을 의미한다. UDF의 내 자신의 사용을 참조하면, 나는 자주 WHERE 절 내에서 "원시"날짜 열을 사용 하겠지만, 선택한 열의로 UDF를 적용합니다. 이와 같이, UDF은 필터의 일부로서 상기 필터링 된 결과 집합이 아닌 상기 테이블의 모든 행에인가된다.

    물론, 이것에 대한 절대 가장 좋은 방법은 기본적으로 개별 날짜 및 시간 구성 요소를 제공하고있는 SQL Server 데이터베이스 엔진으로, SQL 서버 2008 (또는 그 이상)을 사용하여 날짜와 시간을 분리하는 것입니다, 그리고 할 수있는 효율적 쿼리이 독립적으로 복합 형 날짜에서 날짜 또는 시간 부분 중 하나를 추출하는 UDF 또는 다른기구 없이도.

  23. ==============================

    23.내가 사용합니다 :

    내가 사용합니다 :

    CAST
    (
    CAST(YEAR(DATEFIELD) as varchar(4)) + '/' CAST(MM(DATEFIELD) as varchar(2)) + '/' CAST(DD(DATEFIELD) as varchar(2)) as datetime
    ) 
    

    따라서 효과적으로 당신이 이미 가지고있는 날짜 필드에서 새 필드를 생성.

  24. from https://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-server by cc-by-sa and MIT license