2011-01-05 4 views
1

이 질문이 너무 길지만이 지점으로 이동하기 위해 수행 한 모든 단계가 포함되었는지 미리 알고 싶습니다.내 SQL 날짜 비교 결과가 0으로 반환되는 이유

내 SQL 서버 2008 데이터베이스를 다음과 같은 테이블이 :

그것은 다음과 같이 그것의 일부 행이
CREATE TABLE [VSPRRecalc](
    [VSPRDate] [datetimeoffset](7) NOT NULL, 
    [CalcType] [int] NOT NULL, 
CONSTRAINT [PK_VSPRRecalc] PRIMARY KEY CLUSTERED ([VSPRDate] ASC) 

: 나는 확인하고 볼 수 LINQ를 사용하고

INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-15 10:17:49.5780000 -05:00','3') 
INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-16 07:44:03.3750000 -05:00','1') 
INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-17 07:40:40.1090000 -05:00','1') 
INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-18 16:29:02.2203744 -05:00','2') 
INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-20 09:58:50.1250000 -05:00','1') 
INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-29 19:21:26.8120000 -05:00','1') 

을 주어진 날짜가이 테이블에 이미 존재하면 :

현재 recalc은 n을 반환합니다. (위의 삽입 문에서 12-29 경우와 같이) 자정으로부터 5 시간 이내에있을 때마다. 확인하고 다음 SQL 실행되고 :

exec sp_executesql N'SELECT [t0].[VSPRDate], [t0].[CalcType] 
        FROM [dbo].[VSPRRecalc] AS [t0] 
        WHERE 
        CONVERT(DATE, [t0].[VSPRDate]) = @p0',N'@p0 datetime',@p0='2010-12-29' 

어떤 0 레코드를 반환합니다. 나는 놀 테스트 쉽게하기 위해 쿼리를 수정 해낸 다음 그 쿼리가 아니라 자정 5 시간 내에 모든 날짜 (다시 테이블에 다른 날짜를 작동

declare @t as date 
set @t = '2010-12-29' 

select *, 
case when CONVERT(DATE, [VSPRDate]) = @t then 'true' else 'false' end 
from VSPRRecalc where 
CONVERT(DATE, [VSPRDate]) = @t 

을 위의 12-29 참조). where 절없이 위의 쿼리를 실행하면 12-29 행에 'true'가 표시되어 부울이 select 문에서 예상하는 방식을 평가하지만 where 절에 표시되지 않습니다. 왜 그런 일이 일어날까요?

:

내가 알 수있는 것은 다음과 같은

+0

이상한, 위의'executeql' 문 ** 작품 ** 1 행) ... – rsenna

+0

... 실제로 위의 마지막 문장도 나를 위해 작동하지 않습니다 ('case' 표현식은 2010-12-29 행에'true '를 반환하지만, where 부분을 포함하면 행이 반환되지 않음)! – rsenna

+0

죄송합니다. SQL 문을 실행하면 일부 테스트에서 남겨졌습니다. 나는 거기에 있었음에 틀림없는 것을 반영하기 위해 지금 편집했습니다. '및 VSPRDate = '2010-12-29 19 : 21 : 26.8120000 -05 : 00''을 포함하면 쿼리가 작동합니다. 나는 그 차이가 무엇인지 모른다. – Mykroft

답변

1
나는 그게 DATETIMEOFFSET 시간과 더 "표준"유형 DATETIMEDATE 사이의 변환에 대해 SQL Server에서 버그 말할 것

입니다 ... 작품 : 우리가 DATETIMEOFFSET를 계속 사용하는 경우, 문제가 전혀 없다는 것을 의미

EXEC sp_executesql N'SELECT [t0].[VSPRDate], [t0].[CalcType] 
        FROM [dbo].[VSPRRecalc] AS [t0] 
        WHERE [t0].[VSPRDate] = @p0', 

        N'@p0 DATETIMEOFFSET(7)', 
        @p0 = '2010-12-29 19:21:26.8120000 -05:00' 

.. 그래도 특정 날짜에 모든 레코드를 찾아야 만 정확한 DATETIMEOFFSET을 검색해야하는 것 같습니다. 맞습니까? 또한

그래서, 아마 조금 더 유용

, 작품 :

EXEC sp_executesql N'SELECT [t0].[VSPRDate], [t0].[CalcType] 
       FROM [dbo].[VSPRRecalc] AS [t0] 
       WHERE [t0].[VSPRDate] BETWEEN @p0 AND @p1', 

       N'@p0 DATETIMEOFFSET, @p1 DATETIMEOFFSET', 
       @p0 = '2010-12-29 00:00:00.0000000 -05:00', 
       @p1 = '2010-12-30 00:00:00.0000000 -05:00' 

나는 DATETIMEOFFSET 데이터 형식을 사용하여 계속 여기에 비밀을 추측 (그리고 CLR에 해당, System.DateTimeOffset이다). 그런 식으로 변환 문제에 빠지지 않을 것입니다 ...

(그리고 어쨌든 날짜를 기준으로 레코드를 검색하려면 BETWEEN을 사용해야합니다. 이렇게하면 DBMS는 해당 열에 대한 인덱스를 사용할 수 있습니다. WHERE 절이 함수 호출 또는 하드 코딩 된 변환을 수행 할 때 불가능합니다.

편집 나는 SQL에 대한 Linq에 대한 가능한 BETWEEN 운영자가없는 잊었다 - 그러나 그것은 단지 WHERE [t0].[VSPRDate] >= @p0 AND [t0].[VSPRDate] <= @p1' 같은 것을 사용하여 해결하기 위해 쉽게 ...또한, this 그래서 질문을 구현하기 위해 확장 메서드를 선언하는 방법에 대해 알고 있지만 그것은 작동하는지 모르겠다 ...

+0

Linq를'VSPRDate> = oDate.Date && VSPRDate Mykroft