source

SQL Server에서 날짜 시간에서 밀리초 제거

ittop 2023. 6. 26. 23:10
반응형

SQL Server에서 날짜 시간에서 밀리초 제거

select *
from table
where date > '2010-07-20 03:21:52'

결과가 나오지 않을 것으로 예상됩니다날짜가 적힌 레코드를 받는 것만 빼면요2010-07-20 03:21:52.577

쿼리를 밀리초 단위로 무시하려면 어떻게 해야 합니까?

다음과 같이 날짜의 밀리초 부분을 계산하고 비교하기 전에 빼기만 하면 됩니다.

select * 
from table 
where DATEADD(ms, -DATEPART(ms, date), date) > '2010-07-20 03:21:52'

SQL 서버(2008년부터)를 사용하는 경우 다음 중 하나를 선택합니다.

  • 변환(DATTIME2(0), 사용자 날짜 필드)
  • 왼쪽(RTRIM(변환(DATIMEOFSET, 사용자 날짜 필드)), 19)
  • CONVERT(DATIMEOFSET(0), YourDateField) - 표준 시간대 오프셋을 추가합니다.

시도:

SELECT * 
FROM table 
WHERE datetime > 
CONVERT(DATETIME, 
CONVERT(VARCHAR(20), 
CONVERT(DATETIME, '2010-07-20 03:21:52'), 120))

또는 날짜가 실제 날짜 시간 값인 경우:

DECLARE @date DATETIME
SET @date = GETDATE()
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(20), @date, 120))

120번 스타일로 변환하면 밀리초가 단축됩니다.

select * from table
     where DATEADD(ms, DATEDIFF(ms, '20000101', date), '20000101') > '2010-07-20 03:21:52'

비교하기 전에 밀리초를 잘라야 하며, 이는 많은 행에서 느려집니다.

이 문제를 해결하려면 다음 중 하나를 수행합니다.

  • 비교하기 위해 위의 식을 사용하여 계산된 열을 만들었습니다.
  • 읽기 오버헤드를 방지하기 위해 삽입/업데이트 시 밀리초 제거
  • SQL Server 2008의 경우

CAST는 다음 파라미터와 함께 사용합니다.

날짜.

select Cast('2017-10-11 14:38:50.540' as date)

출력: 2017-10-11

날짜/시간

select Cast('2017-10-11 14:38:50.540' as datetime)

출력: 2017-10-11 14:38:50.540

소규모 데이터 시간

select Cast('2017-10-11 14:38:50.540' as smalldatetime)

출력 : 2017-10-11 14:39:00

이 방법은 전체 분으로 반올림됩니다(초와 밀리초가 손실됩니다).

날짜/시간 간격띄우기

select Cast('2017-10-11 14:38:50.540' as datetimeoffset)

출력: 2017-10-11 14:38:50.5400000 +00:00

Datetime2

select Cast('2017-10-11 14:38:50.540' as datetime2)

출력: 2017-10-11 14:38:50.5400000

이 특정 쿼리의 경우 다음 높은 초부터 시작하는 값을 요청할 수 있는데 각 행에 대해 값비싼 함수 호출을 하는 이유는 무엇입니까?

select *
from table
where date >= '2010-07-20 03:21:53'

'작은 날짜' 데이터 유형 사용

select convert(smalldatetime, getdate())

가져올 것입니다

2015-01-08 15:27:00

여러 가지 방법이 있습니다.

select 1 where datediff(second, '2010-07-20 03:21:52', '2010-07-20 03:21:52.577') >= 0

또는

select *
from table
where datediff(second, '2010-07-20 03:21:52', date) >= 0 

함수 호출이 하나 줄었지만 날짜가 너무 멀면 최대 정수가 넘치지 않도록 주의해야 합니다.

저장 프로시저를 사용하여 특정 초("YYY-MM-DD HH:TT:SS" 형식의 매개 변수)에서 이벤트를 찾을 때 밀리초를 무시하도록 SQL Server 쿼리를 설정했습니다.

  WHERE 
  ...[Time_stamp] >= CAST(CONCAT(@YYYYMMDDHHTTSS,'.000') as DateTime) AND 
  ...[Time_stamp] <= CAST(CONCAT(@YYYYMMDDHHTTSS,'.999') as DateTime) 

몇 분과 몇 초를 무시하는 것과 비슷한 방법을 사용할 수도 있습니다.

이것 좀 드셔보세요.

select substring('12:20:19.8470000',1,(CHARINDEX('.','12:20:19.8470000',1)-1))


(No column name)
12:20:19

많이 늦었지만 며칠 전에도 같은 문제가 있었습니다.위의 솔루션 중 어떤 것도 작동하지 않거나 적합해 보이지 않았습니다.밀리초 단위의 타임스탬프가 필요했기 때문에 Date_Format을 사용하여 문자열로 변환한 다음 Str_To_Date:

STR_TO_DATE(DATE_FORMAT(your-timestamp-here, '%Y-%m-%d %H:%i:%s'),'%Y-%m-%d %H:%i:%s')

약간 지저분하지만 매력적으로 작동합니다.

이게 도움이 될지도..SELECT [Datetime] = CAST ('20120228' AS 소규모 날짜)

o/p: 2012-02-28 00:00

이 예를 검토합니다.

declare @now datetimeoffset = sysdatetimeoffset();
select @now;
-- 1
select convert(datetimeoffset(0), @now, 120);
-- 2
select convert(datetimeoffset, convert(varchar, @now, 120));

다음과 같은 출력을 생성합니다.

2021-07-30 09:21:37.7000000 +00:00
-- 1
2021-07-30 09:21:38 +00:00
-- 2
2021-07-30 09:21:37.0000000 +00:00

(1)의 경우 결과는 반올림되고(이 경우 올림), (2)의 경우 결과는 잘립니다.

따라서 질문에 따라 날짜(시간) 유형 값을 밀리초 단위로 잘라내려면 다음을 사용해야 합니다.

declare @myDateTimeValue = <date-time-value>
select cast(convert(varchar, @myDateValue, 120) as <same-type-as-@myDateTimeValue>);

언급URL : https://stackoverflow.com/questions/3286849/sql-server-remove-milliseconds-from-datetime

반응형