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에서 캐스팅하지 않는 것 FLOAT
을 DATETIME
이 그것을 바닥재 전에 3 밀리 초를 추가하므로, 정확하게.
이 쿼리는 trunc(sysdate)
Oracle 과 동등한 결과를 제공해야합니다 .
SELECT *
FROM your_table
WHERE CONVERT(varchar(12), your_column_name, 101)
= CONVERT(varchar(12), GETDATE(), 101)
도움이 되었기를 바랍니다!
using Substring
datetime 변수에서 날짜 를 추출 할 수 있으며 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
'development' 카테고리의 다른 글
NSLocalizedString이 특정 언어를 사용하도록하는 방법 (0) | 2020.04.01 |
---|---|
IntelliJ IDEA를 사용하여 Java 코드 라인을 계산하는 방법은 무엇입니까? (0) | 2020.03.31 |
확장자없이 파일 이름 얻기 (0) | 2020.03.31 |
CSS를 사용하여 3 div를 나란히 플로팅하는 방법은 무엇입니까? (0) | 2020.03.31 |
C에서 MIN과 MAX (0) | 2020.03.31 |