문제

날짜 A부터 날짜까지 기록을 반환하도록 보고서를 제한하고 싶습니다. 이것이 제가하고있는 일입니다.

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

... 3 월 31 일 1 월 1 일부터 11시 59 분까지 오전 12 시부 터 오후 11시 59 분까지 반환 된 기록을 들었습니다 (자정은 시간이 표시되지 않은 경우 기본값입니다). 그러나 나는 불일치가 있음을 알았습니다. 레코드에 00:00:00의 시간이있는 경우이 세트의 일부가 될 것입니다.

이 작업을 수행하는 더 정확한 방법이 있으므로 원하는 날짜 범위를 정확히 반환 할 수 있습니까?*

시간을 사용해 보았습니다.

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008 00:00:00'
set @endDate = '04/01/2008 11:59:59'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

...하지만 SQL Server는 Hundreth를 반으로 반올림합니다. 그래서 11:59:29 이후에 언제든지 사용한다면 4 월 1 일 레코드 (Ha! April Fool 's Record! Grr)를 얻습니다. 왜 그런 겁니까?

  • (나는 확실하다고 생각합니다. 나는 이것에 새롭습니다. 도와 주셔서 감사합니다!)
도움이 되었습니까?

해결책

항상 쉬운 옵션이 있습니다.

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date >= @startDate 
and   date < @endDate

다른 팁

view_inspections의 날짜 열이 작은 데이터 타임 데이터 유형이라고 생각합니다. 이 데이터 유형은 1 분의 정확도를 가지고 있으며, 이는 예기치 않은 결과를 설명합니다 (초를 가장 가까운 분까지 반올림).

Roland Shaw가 제안한 방법은 요구 사항을 수용하기 위해 쿼리를 수정하는 가장 좋은 방법입니다.

사이의 연산자는 포괄적이므로 첫 번째 쿼리에있는 결과가 보입니다. 두 번째 쿼리에서보고있는 반올림은 테이블에서 사용하는 정확한 DateTime 데이터 유형에 따라 다릅니다. (BTW, 수백 분의 1 초 만에 혼란스러워한다고 생각합니다). 테이블에서 작은 시간을 사용하는 것 같습니다.이 경우 시간이 가장 가까운 분으로 반올림됩니다.

테이블이 dateTime을 사용하는 경우 @startDate 및 @endDate를 dateTime 값으로 명시 적으로 변환 해보십시오 (cast (@enddate as dateTime)).

빠른 참고 사항 ... DateTime 값의 경우에도 SQL Server는 3/10 초에만 정확하므로 11 : 59 : 59.999는 최대 12 : 00 : 00.000까지 반올림됩니다.

기본적으로 세 가지 선택이 있습니다.

1) Cast ('01/01/2008 00 : 00 : 00 : 00.000 '사이에서 DATETIME로) 및 CAST ('03/31/2008 12 : 59 : 59.997'DateTime)

2) 연도 (my_date) = 2008 및 Month (My_date) 1과 3 사이

3) my_date> = cast ('01/01/2008 00 : 00 : 00 : 00.000 'as dateTime) 및 my_date <cast ('04/01/2008 00 : 00 : 00.000')

첫 번째 방법은 직관적이지 않으며 제 생각에는 오류가 발생하기 쉽습니다. 두 번째 방법은 인덱스를 사용할 수 없기 때문에 성능을 죽이고 몇 년 동안 몇 년 동안 검색을하거나 시작/종료 할 수 있다면 훨씬 더 복잡해집니다. Rowland가 제안한 세 번째 방법은 내가 생각하는 최고입니다.

날짜 필드에서 시간을 제거하기 만하면됩니다.

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

SELECT min(date),max(date) FROM view_Inspections 
WHERE CAST(FLOOR(CAST(date AS FLOAT)) AS DATETIME) BETWEEN CAST(@startDate AS DATETIME) And CAST(@startDate AS DATETIME))

이것은 모든 것을 반환합니다 01/01/2008 00:00:00 에게 04/01/2008 11:59:59.999. 원하지 않는다면 04/01 포함, 종료 날짜를 변경하십시오 03/31/2008.

최상의 솔루션은 단지 "줄리안"이라는 Bigint (10) 필드를 만들고 yyyymmdd에 보관하는 것입니다.

그런 다음 Julian> = '20120103'및 Julian <= '20120203'인 쿼리를하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top