2013-07-23 3 views
2

에 결과를 비교는 때때로 캐스팅 날짜 시간에 DateTimeOffset으로는 UTC날짜 시간에 DateTimeOffset으로 캐스팅 및 날짜 시간

나는 특정 날짜 사이에 발생하는 모든 주문을 찾고 싶은

로 다시하는 DateTimeOffset 필드를 취할 것으로 보인다. OrderDateTime은 DateTimeOffset으로 저장됩니다. 이 쿼리에 대한

DECLARE @StartDate DATETIME = '20130723' 
     ,@EndDate DATETIME = '20130724' 

SELECT cn.orderdatetime, 
     LocalTime = CAST(orderdatetime AS datetime), 
     facilityid 
FROM ConsignmentNote cn 
WHERE CAST(OrderDateTime AS DATETIME) BETWEEN @StartDate AND @EndDate 

결과는 (당신이 기대하는 것처럼)

OrderDateTime       LocalTime     Facilityid 
2013-07-23 08:26:02.9120644 +10:00 2013-07-23 08:26:02.913 84 
2013-07-23 08:27:43.9571506 +10:00 2013-07-23 08:27:43.957 84 
2013-07-23 10:24:54.2930893 +10:00 2013-07-23 10:24:54.293 84 

그러나 나는 또한 facilityID 설정이 결과를 필터링해야 - 나는 쿼리에 facilityId를 추가하는 경우 만 :

DECLARE @StartDate DATETIME = '20130723' 
     ,@EndDate DATETIME = '20130724' 

SELECT cn.orderdatetime, 
     LocalTime = CAST(orderdatetime AS datetime), 
     facilityid 
FROM ConsignmentNote cn 
WHERE CAST(OrderDateTime AS DATETIME) BETWEEN @StartDate AND @EndDate 
AND FacilityId = 84 

나는 다음과 같은 결과를 얻을 수

orderdatetime      LocalTime    facilityid 
2013-07-23 10:24:54.2930893 +10:00 2013-07-23 10:24:54.293 84 

무엇을 제공합니까? 쿼리에 다른 매개 변수를 추가하면 날짜가 왜 잘못됩니까?

그냥 그 점을 증명하기 위해 (facilityID NB consignmentNote 표 INT입니다) - 나는 하루에 다시 STARTDATE를 이동하는 경우 '20130722'이 나는 결과의 3 행은 내가 나타 내기 위해 보인다, 찾고 있어요 얻을 :

CAST (OrderDateTime as DateTime) 

은 SELECT 또는 WHERE 절에 다른 매개 변수가 있는지에 따라 다르게 처리됩니다 (예 :?). (글쎄 그것은 균일 한 치료로 보이지 않는다)

누구든지이 문제를 해결하기 위해 어떤 방향으로 나를 가리킬 수 있습니까? 이 서비스 팩 또는 핫픽스

마이크로 소프트 SQL 서버 2008 R2 (SP1)이 될 수 - 10.50.2500.0 (X64) 6 월 17 일 2011 0시 54분 3초 저작권 (c) Microsoft의 엔터프라이즈 에디션 (64 비트) Windows NT 6.1의 경우 (빌드 7601 : 서비스 팩 1)

btw -이 값만있는 테이블을 만들면 모든 문제없이 (아래 코드) 예상대로 작동합니다. 그래서 그것은 환경 적이어야합니다 - 네?

CREATE TABLE #temp (orderdatetime DATETIMEOFFSET,facilityid int) 
INSERT INTO #temp VALUES ('2013-07-23 08:26:02.9120644 +10:00',84) 
INSERT INTO #temp VALUES ('2013-07-23 08:27:43.9571506 +10:00',84) 
INSERT INTO #temp VALUES ('2013-07-23 10:24:54.2930893 +10:00',84) 

SELECT  orderdatetime,CAST(orderdatetime AS datetime),facilityid 
FROM #temp 
WHERE CAST(OrderDateTime AS DATETIME) BETWEEN @StartDate AND @EndDate 
AND facilityid =84 

DROP TABLE #temp 

답변

1

This guy 당신이 우연히 발견 한 것의 반대를 시도했습니다. 즉, 그는 자신의 datetime 오프셋을 UTC로 변환하려고 시도하고있었습니다. 그러나 당신이 관련성이 있다고 생각하는 유형의 캐스팅에 대한 논의가 있습니다. 다음 테스트에서

는 :

DECLARE @Something datetimeoffset(7) 

SET @Something = '2008-12-19 17:30:09.1234567 +11:00' 

SELECT 1 
WHERE DATEPART(hour, convert(datetime, @Something)) = 17 

select cast(@Something as datetime) 
select convert(datetime, @Something, 109) 

그 CONVERT는 SELECT 절에 시간대를 변경하지 않습니다 또한 WHERE 절에서 UTC에 시간대를 변경하지 않습니다 나타납니다. 그러나 변환 스타일을 사용하면 UTC로 바뀝니다.

희망이 도움이됩니다.

1

해당 열에 대한 색인이 있습니까? 그렇다면 KB2715289에 설명 된 문제에 대한 또 다른 변형이 있다고 생각합니다.

이 그 기사에 따르면, 문제가 수정되었습니다 :

나는 최신 업데이트를 적용 제안 수동 또는 Microsoft Update를 통해 여전히 문제가 있는지 확인하십시오.

+0

예, 열은 색인의 일부입니다. 업데이트를 적용하고 알려 드리겠습니다 ... 도움을 주셔서 감사합니다. – Trubs