development

SQL Server에서 날짜 시간을 자르려면 어떻게해야합니까?

big-blog 2020. 3. 31. 08:22
반응형

SQL Server에서 날짜 시간을 자르려면 어떻게해야합니까?


SQL Server 2008에서 날짜 시간 값을 자르는 가장 좋은 방법은 무엇입니까 (시간 및 분 제거)?

예를 들면 다음과 같습니다.

declare @SomeDate datetime = '2009-05-28 16:30:22'
select trunc_date(@SomeDate)

-----------------------
2009-05-28 00:00:00.000

이것은 몇 년이 지난 후에도 계속해서 추가 투표를 계속 수집하므로 최신 버전의 Sql Server에 대해 업데이트해야합니다. Sql Server 2008 및 이후 버전의 경우 간단합니다.

cast(getDate() As Date)

하단 근처의 마지막 세 단락이 여전히 적용되므로, 한 걸음 물러서서 먼저 캐스트를 피할 수있는 방법을 찾아야합니다.

그러나 이것을 달성하는 다른 방법들도 있습니다. 가장 일반적인 것은 다음과 같습니다.

올바른 방법 (Sql Server 2008 이후의 새로운 기능) :

cast(getdate() As Date)

올바른 방법 (이전) :

dateadd(dd, datediff(dd,0, getDate()), 0)

현재는 나이가 들었지만, 달, 분, 시간 또는 연도의 첫 번째 순간과 같은 다른 시점에도 쉽게 적용 할 수 있기 때문에 여전히 알 가치가 있습니다.

이 올바른 방법은 ANSI 표준의 일부이며 작동이 보장되는 문서화 된 기능을 사용하지만 다소 느려질 수 있습니다. 0 일부터 현재 날짜까지 며칠이 지 났는지 확인하고 0 일까지 며칠을 추가하여 작동합니다. 날짜 시간이 어떻게 저장되는지, 로케일이 무엇이든 관계없이 작동합니다.

빠른 길 :

cast(floor(cast(getdate() as float)) as datetime)

날짜 시간 열이 8 바이트 이진 값으로 저장되기 때문에 작동합니다. 플로팅으로 캐스트하고, 분수를 제거하기 위해 플로어하고, 날짜 / 시간으로 다시 캐스트 할 때 값의 시간 부분이 사라집니다. 복잡한 논리없이 조금만 이동하고 매우 빠릅니다.

이는 자동 서비스 업데이트에서도 Microsoft가 언제든지 변경할 수있는 구현 세부 사항에 의존합니다. 또한 휴대하기가 쉽지 않습니다. 실제로이 구현이 언제라도 변경 될 가능성은 거의 없지만, 사용하기로 선택한 경우 여전히 위험을 인식하는 것이 중요합니다. 이제 날짜로 전송할 수있는 옵션이 있으므로 거의 필요하지 않습니다.

잘못된 방법 :

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

잘못된 방법은 문자열로 변환하고 문자열을 자르고 날짜 시간으로 다시 변환하여 작동합니다. 그것은 두 가지 이유로 잘못 되었습니다 : 1) 모든 로케일에서 작동하지 않을 수도 있습니다 .2) 가능한 가장 느린 방법입니다. 다른 옵션보다 한두 배 정도 느립니다.


업데이트 최근에 일부 투표가 이루어 졌으므로이 게시물을 게시 한 후 Sql Server가 "올바른"방법과 "빠른"방법 간의 성능 차이를 최적화 할 것이라는 확실한 증거를 보았습니다. , 이제 이전을 선호해야합니다.

두 경우 모두 처음부터이 작업을 수행 할 필요가 없도록 쿼리를 작성하려고합니다 . 데이터베이스에서이 작업을 수행해야하는 경우는 매우 드 rare니다.

대부분의 경우 데이터베이스는 이미 병목 상태입니다. 일반적으로 성능 향상을 위해 하드웨어를 추가하는 것이 가장 비용이 많이 드는 서버이고 추가 기능을 올바르게 적용하기 가장 어려운 서버입니다 (예 : 디스크와 메모리의 균형을 조정해야 함). 또한 기술적으로나 비즈니스 관점에서 볼 때 외부로 확장하기가 가장 어렵습니다. 기술적으로 데이터베이스 서버보다 웹 또는 응용 프로그램 서버를 추가하는 것이 훨씬 쉽고, 그것이 거짓 인 경우에도 IIS 또는 Apache의 서버 라이센스 당 $ 20,000 이상을 지불하지 않습니다.

내가하려고하는 요점은 가능하면 응용 프로그램 수준 에서이 작업을 수행해야한다는 것입니다. 단지 당신이 하루에 의해 그룹에 필요, 심지어 그때는 아마 삽입 / 업데이트시에 유지되는 계산 열로 설정 여분의 열을해야하거나 유지 관리 할 때 당신이 이제까지 자신의 SQL Server에서 날짜를 절단 찾아야 할 때입니다 응용 로직에서. 이 인덱스를 깨고 CPU가 많은 작업을 데이터베이스에서 수행하십시오.


SQL Server 2008 전용

CAST(@SomeDateTime AS Date) 

그런 다음 원하는 경우 날짜 시간으로 다시 캐스팅하십시오.

CAST(CAST(@SomeDateTime AS Date) As datetime)

보다 완벽한 대답을 위해 날짜를 아래로 자르고 분을 포함 GETDATE()하여 잘릴 수있는 효과적인 방법이 있습니다 (자르는 날짜로 대체 ).

이것은 dd(일)뿐만 아니라 모든 날짜 부분 ( 여기 참조)을 사용할 수 있다는 점에서 허용되는 대답과 다릅니다 .

dateadd(minute, datediff(minute, 0, GETDATE()), 0)

위의 식에서 0는 연초 (1900-01-01)의 상수 날짜입니다. 초 또는 밀리 초와 같이 작은 부품으로 잘라야하는 경우 오버플로를 피하기 위해 잘리는 날짜에 가까운 일정한 날짜를 가져와야합니다.


웹에서 찾은 스 니펫은 다음과 같습니다.

 dateadd(dd,0, datediff(dd,0, YOURDATE))
 e.g.
 dateadd(dd,0, datediff(dd,0, getDate()))

SQl 2005에서는 trunc_date 함수를 다음과 같이 작성할 수 있습니다.

(1)

CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
    CAST(FLOOR( CAST( @date AS FLOAT ) )AS DATETIME)
END

첫 번째 방법은 훨씬 더 깨끗합니다. 최종 CAST ()를 포함하여 3 개의 메서드 호출 만 사용하며 자동 연결 인 문자열 연결을 수행하지 않습니다. 또한 여기에는 거대한 캐스트가 없습니다. 날짜 / 시간 스탬프를 표현할 수 있다고 생각되면 날짜에서 숫자로, 다시 날짜로 변환하는 것은 매우 쉬운 과정입니다.

(2)

CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
      SELECT CONVERT(varchar, @date,112)
END

Microsoft가 datetimes (2) 또는 (3)을 구현하는 것이 걱정된다면 괜찮을 것입니다.

(삼)

CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
SELECT CAST((STR( YEAR( @date ) ) + '/' +STR( MONTH( @date ) ) + '/' +STR( DAY(@date ) )
) AS DATETIME
END

셋째, 더 자세한 방법입니다. 이를 위해서는 날짜를 년, 월 및 일 부분으로 나누어 "yyyy / mm / dd"형식으로 한 다음 날짜로 다시 캐스팅해야합니다. 이 메소드에는 문자열 연결은 말할 것도없고 최종 CAST ()를 포함하여 7 개의 메소드 호출이 포함됩니다.


CONVERT(DATE, <yourdatetime>) or CONVERT(DATE, GetDate()) or CONVERT(DATE, CURRENT_TIMESTAMP)

날짜 선택으로 cast (floor (cast (getdate () as float)))를 선택 하십시오.


DATETIME 필드를 하루 종일 (예 : 1 분)로 자르는 방법을 찾고있는 사용자는 다음을 사용할 수 있습니다.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) + (FLOOR((CAST(GETDATE() AS FLOAT) - FLOOR(CAST(GETDATE() AS FLOAT))) * 1440.0) + (3.0/86400000.0)) / 1440.0 AS DATETIME)

그래서 오늘이 2010-11-26 14:54:43.123된다면 이것은 돌아올 것이다 2010-11-26 14:54:00.000.

잘리는 간격을 변경하려면 1440.0을 하루의 간격 수로 바꾸십시오. 예를 들면 다음과 같습니다.

24hrs          =   24.0  (for every hour)
24hrs / 0.5hrs =   48.0  (for every half hour)
24hrs / (1/60) = 1440.0  (for every minute)

(항상 .0플로트에 내재적으로 캐스트하기 위해 끝에 끝을 놓으십시오 .)


(가) 궁금 당신의 사람들을 위해 (3.0/86400000)내 계산입니다, SQL 서버 2005에서 캐스팅하지 않는 것 FLOATDATETIME이 그것을 바닥재 전에 3 밀리 초를 추가하므로, 정확하게.


이 쿼리는 trunc(sysdate)Oracle 과 동등한 결과를 제공해야합니다 .

SELECT  * 
FROM    your_table
WHERE   CONVERT(varchar(12), your_column_name, 101)
      = CONVERT(varchar(12), GETDATE(), 101)

도움이 되었기를 바랍니다!


using Substringdatetime 변수에서 날짜 추출 할 수 있으며 datetime으로 다시 캐스팅하면 시간 부분이 무시됩니다.

declare @SomeDate datetime = '2009-05-28 16:30:22'
SELECT cast(substring(convert(varchar(12),@SomeDate,111),0,12) as Datetime) 

또한 datetime 변수의 일부에 액세스하여 다음과 같이 구문 잘린 날짜에 병합 할 수 있습니다.

SELECT cast(DATENAME(year, @Somedate) + '-' + 
       Convert(varchar(2),DATEPART(month, @Somedate)) + '-' +
       DATENAME(day, @Somedate) 
       as datetime)

신탁:

TRUNC(SYSDATE, 'MONTH')

SQL 서버 :

DATEADD(DAY, - DATEPART(DAY, DateField) + 1, DateField)

날짜에서 분 또는 시간을 자르는 데 비슷하게 사용할 수 있습니다.


당신은 이것을 할 수 있습니다 (SQL 2008) :

@SomeDate 날짜 = getdate () 선언

select @SomeDate

2009-05-28


TRUNC (aDate, 'DD')는 최소, 초 및 시간을 자릅니다.

SRC : http://www.techonthenet.com/oracle/functions/trunc_date.php

참고 URL : https://stackoverflow.com/questions/923295/how-can-i-truncate-a-datetime-in-sql-server

반응형