SQL Reporting Services夏令时查询

时间:2010-03-23 09:43:56

标签: sql

我的任务是编写MS Dynamic CRM的报告。该报告包含约会和帐户信息。我正在使用Visual Studio 2005和SQL 2005。

我发现的问题是,如果约会的预定开始日期在Britsh夏令时之后但是在创建日期之前(BST),那么dbo.Appointment DB的ScheduledStart字段会使用偏移时间+或 - 小时。这意味着当我使用报告服务查找约会并且约会在约会开始时它将返回没有结果,因为在DB中时间是提前一小时或更晚。我可以手动修改我的搜索时间,但这会在报告上返回错误的时间。

这当然会发生在一年两次,因为约会只是提前几周安排,但它仍然是一个痛苦!

有没有办法使用Transact SQL(或任何方法availbale到SSRS)我可以允许夏令时,所以即使数据库显示一个Sceduled Start(dbo.Appointment.ScheduledStart),比如11:00:00预约实际上是在10:00:00开始?

2 个答案:

答案 0 :(得分:0)

CREATE FUNCTION OffsetBST (@CreatedDateTime   DATETIME,
                           @ScheduledDateTime DATETIME)
RETURNS DATETIME
AS
  BEGIN
      DECLARE @InDateYear VARCHAR(4)
      DECLARE @StartDay VARCHAR(2)
      DECLARE @EndDay VARCHAR(2)
      DECLARE @BSTStart DATETIME
      DECLARE @BSTEnd DATETIME
      DECLARE @OffsetDateTime DATETIME

      SET @StartDay = Convert(VARCHAR(2), (31 - (5 * Year(@CreatedDateTime)/4 + 4) % 7))
      SET @EndDay = Convert(VARCHAR(2), (31 - (5 * Year(@CreatedDateTime)/4 + 1) % 7))
      SET @InDateYear = Convert(VARCHAR(4), Year(@CreatedDateTime))
      SET @BSTStart = Convert(DATETIME, @InDateYear + '-03-' + @StartDay + ' 01:00:00', 20)
      SET @BSTEnd = Convert(DATETIME, @InDateYear + '-10-' + @EndDay + ' 00:00:00', 20)

      IF (@CreatedDateTime BETWEEN DATEADD(yy, DATEDIFF(yy,0,@ScheduledDateTime), 0) AND @BSTStart)
         AND (@ScheduledDateTime BETWEEN @BSTStart AND @BSTEnd)
        SET @OffsetDateTime = Dateadd(hh, 1, @ScheduledDateTime)
      ELSE
        SET @OffsetDateTime = Dateadd(hh, 0, @ScheduledDateTime)

      RETURN @OffsetDateTime
  END

您可以在数据源选择语句中使用它。您将为其提供创建日期和计划日期,并确定计划日期是否需要BST偏移。

像这样:

SELECT A.Appointment_ID, A.Appointment_Name, dbo.OffsetBST(A.Created_Date, 
A.Scheduled_Date) as Scheduled_Date
FROM AppointmentsTable as A

答案 1 :(得分:0)

或者,此case语句将在您现有的查询中使用。

SELECT CASE
     WHEN ([Created_Date] BETWEEN 
     Dateadd(yy, Datediff(yy, 0, [Scheduled_Date]), 0) 
     AND 
     Convert(DATETIME, Convert(VARCHAR(4), Year([Created_Date])) + '-03-' + Convert(VARCHAR(2), (31 - (5 * Year([Created_Date])/4 + 4) % 7)) + ' 01:00:00', 20))
          AND 
          ([ScheduledDate] BETWEEN 
          Convert(DATETIME, Convert(VARCHAR(4), Year([Created_Date])) + '-03-' + Convert(VARCHAR(2), (31 - (5 * Year([Created_Date])/4 + 4) % 7)) + ' 01:00:00', 20) 
          AND 
          Convert(DATETIME, Convert(VARCHAR(4), Year([Created_Date])) + '-10-' + Convert(VARCHAR(2), (31 - (5 * Year([Created_Date])/4 + 1) % 7)) + ' 00:00:00', 20))
     THEN Dateadd(hh, 1, [Scheduled_Date])
     ELSE [Scheduled_Date]
   END AS [Scheduled_Date]