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)