2010-03-19 4 views
1

smalltimedate와 int 및 약 1000 행의 데이터라는 두 개의 필드가있는 테이블을 상상해보십시오. 내가 쿼리에서하려고하는 것은 2010 년 3 월 3 일부터 2010 년 3 월 13 일 사이의 행에 대한 INT 필드의 평균을 찾고 항목이 오전 6 시부 터 오후 11시 사이 인 경우에만 찾아내는 것입니다. SQL 서버에서 smalldatetime의 날짜와 시간을 별도로 쿼리 하시겠습니까?

나는 매우 시작 및 종료 시간 것을 제한하는 그러나
between '2010-03-03 06:00 AND 2010-03-13 23:00' 

을 시도했다. 루프를 사용하여이 작업을 수행 할 수 있지만 훨씬 더 큰 날짜 범위에서 동일한 쿼리를 실행해야합니다. 이렇게하면 서버 리소스가 빨리 소모됩니다. 날짜와 시간을 별도로 쿼리하는 방법이 있습니까?

답변

3
Select ... 
From Table 
Where DateCol >= '20100303' 
    And DateCol < '20100314' 
    And DatePart(hh,DateCol) Between 18 And 23 

나는 20100314와 비교할 때보다 적게 사용하므로, 2010-03-14 자정 전에 아무것도 반환하지 않습니다.

EDIT 당신이 AM이 아니라 AM이라고 말한 것을 깨달았습니다.

추가 SQL에서 "Foo> = DateA and Foo < = DateB"라는 문장이 "DateA와 DateB 간의 Foo"로 번역됩니다. 해당 진술의 두 번째 부분은 보다 작거나에서 DateB까지입니다. 검색어에서 자정까지 2010-03-13에 모든 것을 포함하고자합니다. 나는 내가 검색하고 싶을 때 값을보다 엄격하게 제한하여 검색을 수행한다.

시간과 관련하여 DatePart (hh, DateVal)는 24 시간 시계를 사용하여 시간을 반환합니다. 그래서 오후 6시는 실제로 18시입니다. 오후 6 시부 터 11시 사이에 간다면 우리는 18 시부 터 23시 사이에 정말로 원합니다.

추가 원본 솔루션에 작은 문제가 있음이 나에게 있습니다. 시스템은 11시 (예 : 오후 11시 01 분, 오후 11시 30 분, 오후 11시 50 분 등)에 시간이있는 값을 반환합니다.

Select ... 
From Table 
Where DateCol >= '20100303' 
    And DateCol < '20100314' 
    And DateAdd(day, -DateDiff(Day, 0, [DateCol]), [DateCol]) Between '18:00' And '23:00' 

는 기본적으로,이 값의 날짜 부분을 제거하기 위해 참조 DateDiff 및 DateAdd 함수 기능을 사용하고 있는데 우리가 원하는 값에 대해 비교 : 여기에 그것을 해결할 다른 해결책이다.

+0

당신은 사이의 구문 차이를 설명 할 수 귀하의 경우 문이 : 6 (22) 사이 ('2010-01-31'AND '2010-02-27'BETWEEN TimeOrdPlaced) AND (DATEPART (HH, TimeOrdPlaced)) 광산은 다른 날짜와 시간을 사용하는 구문을 사용하는 것보다 훨씬 높은 결과를 산출합니다. – Kylee

+0

설명하기 위해 내 소식을 확장하는 것이 더 쉬웠다. – Thomas

+0

고마워요! 그게 효과가있는 것처럼 보입니다. – Kylee

2

별도의 계산 열을 datepart (hour, datecolumn) * 60 + datepart (minute, datecolumn) 또는 분당 해결을 필요로하지 않는 시간으로 생성하십시오. 계산 된 열을 색인화 할 수 있도록 유지하면 시간에 따라 범위를 효율적으로 찾을 수 있습니다. SQL 2008에는 몇 가지 개선 사항이 있습니다 (새로운 TIME 유형).

관련 문제