2012-09-21 2 views
3

I이 스토어 절차를 사용하여 특별한 날짜의 데이터를 반환했습니다. 내 QueueDate 형식은 datetime입니다. 그러나 use = where Where 절에서 0을 반환하고 싶을 때, 필드의 시간에 하루 만에 독립된 모든 필드를 원합니다.시간에 관계없이 날짜 비교 (MSSQL)

ALTER PROCEDURE [dbo].[SP_GET_QUEUESINFO_BY_DATE] 
AS 
BEGIN 
declare @date2 datetime 
set @date2= '2012-09-21' 
select COUNT(QueueID) , 
sum(case when QueueNumIn != 0 THEN 1 else 0 end) as 'InQueue', 
sum(case when QueueNumOut != 0 THEN 1 else 0 end) as 'OutQueue' 
from Queue where QueueDate >= @date2 -- QueueDate = @date2 
END 

enter image description here

+0

'date (QueueDate) = @ date2' –

답변

5

당신은 DATEDATETIME에서 데이터 유형을 변경하려면 열 이름을 CAST 수 (이전 버전 2008+에). 올바른,

ALTER PROCEDURE [dbo].[SP_GET_QUEUESINFO_BY_DATE] 
AS 
BEGIN 
declare @date2 datetime 
set @date2= '2012-09-21' 
select COUNT(QueueID) , 
     sum(case when QueueNumIn != 0 THEN 1 else 0 end) as 'InQueue', 
     sum(case when QueueNumOut != 0 THEN 1 else 0 end) as 'OutQueue' 
from Queue 
where CAST(QueueDate as DATE) >= @date2 -- QueueDate = @date2 
END 
0
WHERE DATEDIFF(DAY,@date2, QueueDate)=0 
2

SQL 서버를 시도?

DateTime 값의 날짜 구성 요소 만 비교하려면 SQL Server 2008 이상을 사용하는 것이 좋습니다 (캐스팅/변환은 Date 데이터 형식으로 변환). 이런 식으로 뭔가 당신을 수행해야합니다

select * 
from foo 
where convert(date,foo.someDateTimeColumn) = '2012-10-27' 

를 들어 SQL Server의 버전은 다음 작동합니다 :

select * 
from foo 
where convert(datetime,convert(varchar,foo.someDateTimeColumn,112),112) = '2012-10-27' 

위, 112 스타일을 사용하여, 컴팩트 한 형태로 날짜 시간 값으로 변환 ISO 8601 날짜 문자열 'yyyymmdd'다음 날짜 시간 값으로 다시 변환합니다.

또는 SQL Server의 버전, 당신은 시간에 대해 테스트 할 수

declare 
    @dtNow datetime 
set @dtNow = current_timestamp 

declare 
    @TodayStartOfDay datetime , 
    @TodayEndOfDay datetime 
set @TodayStartOfDay = convert(datetime,convert(varchar,@dtNow,112),112) 
set @TodayEndOfDay = dateadd(ms,-3,datetime(day,1,@dtFrom)) 

... 

select * 
from foo 
where foo.someDateTimeColumn between @TodayStartOfDay and @TodayEndOfDay 

이 방법의 장점은 당신의 날짜 시간 컬럼에 어떤 인덱스가 쿼리 최적화 프로그램에 의해 사용을받을 수 있다는 것입니다.