[SQL] 어떻게 SQL Server의 시간을 비교할 수 있습니까?
SQL어떻게 SQL Server의 시간을 비교할 수 있습니까?
나는 SQL 쿼리에서 날짜 필드에 시간을 비교하기 위해 노력하고있어,하지만 잘 모르겠어요. 나는 날짜 부분, 그냥 시간 부분을 비교하고 싶지 않아요.
나는이 일을 해요 :
SELECT timeEvent
FROM tbEvents
WHERE convert(datetime, startHour, 8) >= convert(datetime, @startHour, 8)
이 맞습니까?
내가 8시 0분 0초가 작거나 큰 7시 30분 0초 이상 인 경우 알 필요가 내가 날짜, 그냥 시간 부분을 비교 싶지 않기 때문에 나는 이것을 부탁 해요.
감사!
해결법
-
==============================
1.날짜는 각 행의 문자열로 변환되기 때문에 귀하의 비교 의지의 작품은하지만 속도가 느려질 수 있습니다. 효율적으로 두 시간 부분을 비교하기 위해 시도 :
날짜는 각 행의 문자열로 변환되기 때문에 귀하의 비교 의지의 작품은하지만 속도가 느려질 수 있습니다. 효율적으로 두 시간 부분을 비교하기 위해 시도 :
declare @first datetime set @first = '2009-04-30 19:47:16.123' declare @second datetime set @second = '2009-04-10 19:47:16.123' select (cast(@first as float) - floor(cast(@first as float))) - (cast(@second as float) - floor(cast(@second as float))) as Difference
긴 설명 : SQL 서버의 날짜가 부동 소수점 숫자로 저장됩니다. 소수점 앞에있는 숫자는 날짜를 나타냅니다. 소수점 뒤의 숫자는 시간을 나타냅니다.
그래서 여기 예를 들어 날짜는 다음과 같습니다
declare @mydate datetime set @mydate = '2009-04-30 19:47:16.123'
의는 float로 변환 보자 :
declare @myfloat float set @myfloat = cast(@mydate as float) select @myfloat -- Shows 39931,8244921682
이제 즉, 숫자 후 시간을 참여 :
set @myfloat = @myfloat - floor(@myfloat) select @myfloat -- Shows 0,824492168212601
날짜 시간에 다시 변환 :
declare @mytime datetime set @mytime = convert(datetime,@myfloat) select @mytime -- Shows 1900-01-01 19:47:16.123
1900-01-01 그냥 "제로"날짜입니다; 당신은 단지 시간 예를 포맷 (108)에 대한 지정 변환과 시간 부분을 표시 할 수 있습니다 :
select convert(varchar(32),@mytime,108) -- Shows 19:47:16
그들은 기본적으로 같은 방법으로 저장되어 있기 때문에 날짜와 플로트 사이의 변환은 꽤 빠르다.
-
==============================
2.
convert(varchar(5), thedate, 108) between @leftTime and @rightTime
설명:
당신이 VARCHAR이있는 경우 (5) 당신은 HH를 얻을 것이다 : mm를
당신이 VARCHAR이있는 경우 (8) 당신은 HH를 얻을 : mm의 SS를
108 개 취득 SQL 날짜 만 시간
@leftTime 및 @rightTime 비교하려면 두 변수
-
==============================
3.당신은 SQL 서버 2008을 사용하는 경우, 당신은이 작업을 수행 할 수 있습니다 :
당신은 SQL 서버 2008을 사용하는 경우, 당신은이 작업을 수행 할 수 있습니다 :
WHERE CONVERT(time(0), startHour) >= CONVERT(time(0), @startTime)
다음은 전체 테스트는 다음과 같습니다
DECLARE @tbEvents TABLE ( timeEvent int IDENTITY, startHour datetime ) INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 0, GETDATE()) INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 1, GETDATE()) INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 2, GETDATE()) INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 3, GETDATE()) INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 4, GETDATE()) INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 5, GETDATE()) --SELECT * FROM @tbEvents DECLARE @startTime datetime SET @startTime = DATEADD(mi, 65, GETDATE()) SELECT timeEvent, CONVERT(time(0), startHour) AS 'startHour', CONVERT(time(0), @startTime) AS '@startTime' FROM @tbEvents WHERE CONVERT(time(0), startHour) >= CONVERT(time(0), @startTime)
-
==============================
4.
if (cast('2012-06-20 23:49:14.363' as time) between cast('2012-06-20 23:49:14.363' as time) and cast('2012-06-20 23:49:14.363' as time))
-
==============================
5.그냥 트릭을해야 할 시간 변환 날짜를 변경 :
그냥 트릭을해야 할 시간 변환 날짜를 변경 :
SELECT timeEvent FROM tbEvents WHERE convert(time, startHour) >= convert(time, @startHour)
-
==============================
6.내가 지금까지 솔루션으로 언급 한 하나 (아마도 작은) 문제는 그들이 모든 비교를 처리하는 함수 호출을 요구하는 것처럼 보인다는 것이다. 및 인덱스를 사용할 수 없습니다 - 쿼리 엔진이 전체 테이블을 할 필요가 있다고이 방법은 후에있는 행을 추구하는 검사합니다. 테이블이 특히 큰 얻을하지 않을 경우,이 아마 어떤 부정적인 영향을 없을 것이다 (그리고 당신은 행복이 답변을 무시할 수 있습니다).
내가 지금까지 솔루션으로 언급 한 하나 (아마도 작은) 문제는 그들이 모든 비교를 처리하는 함수 호출을 요구하는 것처럼 보인다는 것이다. 및 인덱스를 사용할 수 없습니다 - 쿼리 엔진이 전체 테이블을 할 필요가 있다고이 방법은 후에있는 행을 추구하는 검사합니다. 테이블이 특히 큰 얻을하지 않을 경우,이 아마 어떤 부정적인 영향을 없을 것이다 (그리고 당신은 행복이 답변을 무시할 수 있습니다).
반면에, 테이블이 상당히 크다고 얻을 수, 경우 쿼리의 성능이 저하 될 수 있습니다.
난 당신이 날짜 부분을 비교하지 않으 밝혔다 알 -하지만 날짜 컬럼에 저장되는 실제 날짜가, 또는 당신은 단지 시간을 저장하는 데 사용하고 있습니까? 후자의 경우, 단순 비교 연산자를 사용할 수 있으며,이 두 CPU 사용량을 줄이고, 사용 통계 및 인덱스 (있는 경우) 쿼리를 최적화하는 쿼리 엔진을 수 있습니다.
그러나, 날짜 열이 이벤트의 날짜와 시간을 저장하는 데 사용되는 경우,이 분명히 작동하지 않습니다. 이 경우, 응용 프로그램 및 테이블 구조를 수정할 수있는 경우 두 개의 별도의 날짜 컬럼에 날짜와 시간을 분리, 또는 인덱싱 된 뷰를 만들 것을 선택 모든 소스 테이블의 (관련) 열, 그리고 포함 된 더 열 대신 뷰를 쿼리하는 응용 프로그램을 변경 - 시간 요소는 (이 계산에 이전 답변 중 하나를 사용)를 검색하고 싶습니다.
-
==============================
7.플로트를 사용하면 작동하지 않습니다.
플로트를 사용하면 작동하지 않습니다.
DECLARE @t1 datetime, @t2 datetime SELECT @t1 = '19000101 23:55:00', @t2 = '20001102 23:55:00' SELECT CAST(@t1 as float) - floor(CAST(@t1 as float)), CAST(@t2 as float) - floor(CAST(@t2 as float))
당신은 값이 동일한 (SQL 서버 2005)하지 않은 것을 볼 수 있습니다. 내가있는 내가 23시 55분 0초 및 00:05:00 사이 인의 현재 시간을 비교했다 (전체 방법 자세한 내용을 가지고) 자정의 주위에 시간을 확인하기 위해이 방법을 사용하고 싶었다.
-
==============================
8.다른 답변에 추가 :
다른 답변에 추가 :
당신은 날짜에서 날짜를 트리밍하는 기능을 만들 수 있습니다
CREATE FUNCTION dbo.f_trimdate (@dat datetime) RETURNS DATETIME AS BEGIN RETURN CONVERT(DATETIME, CONVERT(FLOAT, @dat) - CONVERT(INT, @dat)) END
그래서 이건:
DECLARE @dat DATETIME SELECT @dat = '20080201 02:25:46.000' SELECT dbo.f_trimdate(@dat)
반환 1900-01-01 02 : 25 : 46.000
-
==============================
9.사용 DATEPART 기능 : DATEPART (날짜 부분, 날짜)
사용 DATEPART 기능 : DATEPART (날짜 부분, 날짜)
예컨대 #
이보다 쉽게 비교할 수 분 안에 당신에게 하루의 총 시간을 제공 할 것입니다.
날짜가 동일 위하여려고하는 경우에 당신은 그렇지 않으면 당신은 위와 같이 날짜를 제거해야합니다, 참조 DateDiff을 사용할 수 있습니다
-
==============================
10.당신은 날짜의 2 개 변수를 생성하고 필요 비교하는 날짜의 시간을 설정할 수 있습니다.
당신은 날짜의 2 개 변수를 생성하고 필요 비교하는 날짜의 시간을 설정할 수 있습니다.
declare @date1 datetime; declare @date2 datetime; select @date1 = CONVERT(varchar(20),CONVERT(datetime, '2011-02-11 08:00:00'), 114) select @date2 = CONVERT(varchar(20),GETDATE(), 114)
날짜가 "1900-01-01"당신이 그것을 비교할 수있을 것입니다
if @date1 <= @date2 print '@date1 less then @date2' else print '@date1 more then @date2'
-
==============================
11.
SELECT timeEvent FROM tbEvents WHERE CONVERT(VARCHAR,startHour,108) >= '01:01:01'
이것은 ": MM : SS HH"입니다 스타일 (108)를 사용하여 VARCHAR로 현재 날짜 / 시간을 변환하는 SQL 서버를 알려줍니다. 필요한 경우 01 '하는 또 다른 변환 : 01 : 당신은 또한 '01 교체 할 수 있습니다.
-
==============================
12.난 당신이 DATEPART ( '시간', 날짜)을 사용하려는 생각합니다.
난 당신이 DATEPART ( '시간', 날짜)을 사용하려는 생각합니다.
참조는 여기에 있습니다 :
http://msdn.microsoft.com/en-us/library/ms174420.aspx
-
==============================
13.나는 (날짜는 정수 = 하루 분수 = 시간의 float입니다) 저장 내부에 의존 사랑하지 않아,하지만 난 대답 조니 D. 카노과 같은 일을한다. 이것은 내가 그것을 알고있는 DB의 모든 DEVS 방법입니다. 확실히 문자열로 변환하지 않습니다. 당신이 부동 / int로서 처리 피해야 경우, 최선의 선택은 당겨하는 것입니다시 / 분 / 초 / DATEPART와 밀리 초 ()
나는 (날짜는 정수 = 하루 분수 = 시간의 float입니다) 저장 내부에 의존 사랑하지 않아,하지만 난 대답 조니 D. 카노과 같은 일을한다. 이것은 내가 그것을 알고있는 DB의 모든 DEVS 방법입니다. 확실히 문자열로 변환하지 않습니다. 당신이 부동 / int로서 처리 피해야 경우, 최선의 선택은 당겨하는 것입니다시 / 분 / 초 / DATEPART와 밀리 초 ()
-
==============================
14.나는 당신의 startHour 열을 가정하고 있는데 @startHour 변수는 모두 DATETIME이다; 이 경우, 당신은 문자열로 변환해야합니다 :
나는 당신의 startHour 열을 가정하고 있는데 @startHour 변수는 모두 DATETIME이다; 이 경우, 당신은 문자열로 변환해야합니다 :
SELECT timeEvent FROM tbEvents WHERE convert(VARCHAR(8), startHour, 8) >= convert(VARCHAR(8), @startHour, 8)
-
==============================
15.쿼리는 당신에게 날짜의 시간을 제공 이하
쿼리는 당신에게 날짜의 시간을 제공 이하
select DateAdd(day,-DateDiff(day,0,YourDateTime),YourDateTime) As NewTime from Table
-
==============================
16.@ronmurp 유효한 우려를 제기 - 캐스트 / 바닥 접근 방식은 같은 시간에 대해 다른 값을 반환합니다. @littlechris로하고, 분, 초, 밀리 초 구성 요소가 시간에 해결할 수있는 문제는, 당신은 하루의 시작부터 밀리 초 수를 계산하기 위해이 기능을 사용할 수있는보다 일반적인 솔루션에 대한 대답의 라인을 따라.
@ronmurp 유효한 우려를 제기 - 캐스트 / 바닥 접근 방식은 같은 시간에 대해 다른 값을 반환합니다. @littlechris로하고, 분, 초, 밀리 초 구성 요소가 시간에 해결할 수있는 문제는, 당신은 하루의 시작부터 밀리 초 수를 계산하기 위해이 기능을 사용할 수있는보다 일반적인 솔루션에 대한 대답의 라인을 따라.
Create Function [dbo].[MsFromStartOfDay] ( @DateTime datetime ) Returns int As Begin Return ( ( Datepart( ms , @DateTime ) ) + ( Datepart( ss , @DateTime ) * 1000 ) + ( Datepart( mi , @DateTime ) * 1000 * 60 ) + ( Datepart( hh , @DateTime ) * 1000 * 60 * 60 ) ) End
나는 그것이 같은 시간에 두 개의 서로 다른 날짜에 동일한 int를 돌려 것을 확인했습니다
declare @first datetime set @first = '1900-01-01 23:59:39.090' declare @second datetime set @second = '2000-11-02 23:56:39.090' Select dbo.MsFromStartOfDay( @first ) Select dbo.MsFromStartOfDay( @second )
이 솔루션은 항상 당신이 기대할 수있는 INT를 반환하지 않습니다. 예를 들어, SQL 2005에서 아래 시도 대신 '556'의 '557'로 끝나는 int를 반환합니다.
set @first = '1900-01-01 23:59:39.556' set @second = '2000-11-02 23:56:39.556'
나는이 플로트로 저장 날짜 시간의 본질과 관련이있다 생각합니다. 당신은 여전히하지만, 두 수를 비교할 수 있습니다. 내가 DateTime.Now ()를 사용하여 .NET에서 캡처 및 SQL에 저장된 날짜 시간의 "진짜"데이터 세트에이 방법을 사용할 때, 나는 계산이 정확한 사실을 발견했습니다.
from https://stackoverflow.com/questions/807909/how-can-i-compare-time-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MyBatis로 일괄 삽입 / 업데이트 오라클 (0) | 2020.04.30 |
---|---|
[SQL] MySQL의에서 다음 사용 가능한 ID를 찾기 (0) | 2020.04.30 |
[SQL] 어떻게 그룹 CONCAT MySQL의와 JSON 형식을 만들? (0) | 2020.04.30 |
[SQL] 어떻게 하나의 SQL 문에서 VARCHAR [N] 필드의 크기를 얻으려면? (0) | 2020.04.30 |
[SQL] mysql을 - 너무 많은 얼마나 많은 열입니까? (0) | 2020.04.30 |