저는 데이터베이스에 모든 날짜를 UTC 시간으로 몇 년 동안 저장했지만 최근에는보고 서비스에서 날짜 범위 쿼리를 처리하는 것이 점점 어려워지고 있습니다. 현지 시간으로 지정됩니다.SQL Server Reporting Services 및 UTC 시간
특히,의 설정이 예제 데이터를 보자 :
이EmailAddress DateCreated
[email protected] 2009-09-01 00:00:00
[email protected] 2009-09-01 00:00:00
[email protected] 2009-02-28 04:00:00
[email protected] 2009-04-27 14:33:00
[email protected] 2009-08-31 17:28:00
[email protected] 2009-03-19 18:57:00
[email protected] 2009-03-01 00:49:00
[email protected] 2009-02-28 04:00:00
[email protected] 2009-09-01 00:00:00
[email protected] 2009-09-16 00:00:00
이제 클라이언트가 중앙 표준 시간을 사용하여 2 월을 위해 존재 얼마나 많은 기록을보고 싶어 가정 해 봅시다. 그룹화를하기 전에 UTC 타임 스탬프를 CST로 변환해야하기 때문에 UTC 시간을 사용하여 레코드를 쿼리 할 수 없습니다. 즉, UTC 날짜가 3 월에 정식으로 표시 되더라도 CST 날짜를 사용하여 2 월에 레코드 # 7 (2009-03-01 00:49:00)을 계산해야합니다. 보통 일이 끝나는 무엇
내가 쿼리가 보이는하도록 날짜를 변환하는 함수를 작성하는 것이 그래서 같은 :
select
dbo.ConvertToLocalDate(DateCreated),
count(*) as [Count]
from
example_table
group by
dbo.ConvertToLocalDate(DateCreated)
하지만 이러한 쿼리의 성능이보다 더 아무것도 바람직 미만 수십만 줄. 나는 현지 날짜를 미리 계산하는 열을 추가 포함하여 주제에 몇 가지 변화를 시도했습니다, 또한 수정 된 쿼리를 같은 :
select
t3.LocalDateCreated,
count(*) as [Count]
from
example_table t1
inner join (
select
t2.Email,
dbo.ConvertToLocalDate(t2.DateCreated) as LocalDateCreated
from
example_table t2) t3 on t3.Email = t1.Email
group by
t3.LocalDateCreated
이 모든하지만 나에게 정말 hackish 보인다. 더 좋은 방법이 있습니까?
쿼리 최적화 프로그램에 대한 함수의 영향과 함수 호출이 내 성능 문제의 주요 원인이라는 사실을 알고 있습니다. 함수 호출을 없애기 위해 로컬 날짜를 유지하기 위해 secondd 열을 사용했지만 DateCreatedUtc가 있고 그 옆에 DateCreatedLocal 열이있는 것이 이상하게 보입니다. 아마 내가해서는 안되는 것에 대해 걱정하고있을거야? – Chris
나는보고 목적으로 두 번째 열을 엄격하게 요구하는 것이 이상하다고 생각합니다. – Chris
예, 걱정하지 않아도됩니다. 계산 된 열 (유지됨 또는 유지되지 않음) 인 경우 무결성 문제에 대해 걱정할 필요가 없으며 성능 향상이 중요합니다. –