我的任务是编写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开始?
答案 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]