2014-03-05 2 views
0

MS SQL 서버에 일정 레코드가있는 테이블이 있습니다.DATEDIFF 결과에 대한 집계 함수

각 일정은 사용자에게 할당되며 시작 날짜가 있습니다. 시작 날짜 시간은 해당 일정이 유효한 시점입니다. 이 시점 이전에는 이전 시작 날짜가있는 일정이 사용됩니다.

해당 날짜에 유효했던 일정의 ID를 결정하는 쿼리를 작성해야합니다.

  1. 2008-11-18
  2. 2008-12-15
  3. 2009-07-02
  4. 2009-2010 :

    의는 다음 시작 날짜와 사용자 X에 대한 다음과 같은 기록이있다 가정 해 봅시다 08-11

2008-11-18부터 2008-12-14까지의 날짜는 유효한 일정이 1입니다. 2008-12-15부터 2009-07-01까지 유효한 날짜는 2입니다. ~로부터의 일 2009 년 7 월 2 일부터 2009 년 8 월 10 일까지 유효한 일정은 3입니다. 2009-08-11 이후 일의 경우 유효한 일정은 4입니다.

DATEDIFF(day, CAST('X' AS DATETIME), startdate)Xstartdate 사이의 일수를 계산합니다. 인 스케줄의 시작 시간을 계산하기 위해

  1. -32
  2. -5
  3. 194
  4. 234

: X=2008-12-20 10:00하고 상기 startimes에 대해 다음의 값을 리턴 유효한 시간은 X입니다. 레코드를 찾으려면 DATEDIFF(day, CAST('X' AS DATETIME), startdate)이 최대 (0에 가장 가까운) 음수 값을 반환해야합니다.

이 작업을 수행하기 위해, 나는 쿼리

SELECT startdate, MAX(DATEDIFF(day, CAST('2008-12-20 10:00' AS DATETIME), startdate)) 
FROM schedules 
WHERE (username = 'username') AND (DATEDIFF(day, CAST('2008-12-20 10:00' AS DATETIME), startdate) < 0) 
GROUP BY startdate, DATEDIFF(day, CAST('2008-12-20 10:00' AS DATETIME), startdate) 

그 결과 하나 행을 얻을 것으로 예상 다음 썼다.

하지만 그 대신, 내가 할 2 행 :

어떻게 DATEDIFF(day, CAST('2008-12-20 10:00' AS DATETIME), startdate)의 최대 음의 값으로 하나 개의 행을 얻기 위해 쿼리를 수정해야합니까? 대신 order bytop를 사용

+0

나는 당신이 DATEDIFF 함수에 의해 그룹화되어서는 안 믿습니다. – NickyvV

답변

2

시도 :

select top 1 s.* 
from schedules s 
where username = 'username' and CAST('2008-12-20 10:00' AS DATETIME) >= startdate 
order by startdate;