你目前正处于脱机状态,正在等待 Internet 重新连接

如何准备 SQL Server 2005 和 SQL Server 2000 以迎接 2007 年夏令时更改

简介
2005 年 8 月,美国国会通过了能源政策法案。此法案对夏令时 (DST) 的开始日期和结束日期都进行了更改。当此法案在 2007 年生效后,DST 将比传统上规定的时间提前三个星期开始,并将推迟一个星期结束。具体而言,DST 将于 3 月第二个星期日凌晨 2:00 开始,并将于 11 月第一个星期日凌晨 2:00 结束。

下表汇总了 2007 年夏令时的更改事项。
以前的 DST 开始日期2007 年的 DST 开始日期以前的 DST 结束日期2007 年的 DST 结束日期
4 月第一个星期日3 月第二个星期日10 月最后一个星期日11 月第一个星期日
应为 2007 年 4 月 1 日2007 年 3 月 11 日应为 2007 年 10 月 28 日2007 年 11 月 4 日
本文讨论如何准备 Microsoft SQL Server 2005 和 Microsoft SQL Server 2000 以迎接 2007 年的 DST 更改。
更多信息

必须执行的操作

如果在配置为自动调整 DST 的计算机上安装了 SQL Server,则该计算机上的时区将遵从 2007 年 DST 更改,您必须执行下列操作:
  • 安装 Microsoft 知识库文章 924840 中描述的 Windows 更新。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    924840已推出 Windows 2007 年全球时区更新的测试版本
  • 如果计算机上安装了 SQL Server Notification Services,请安装 Microsoft 知识库文章 931815 中介绍的更新。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    931815针对 SQL Server 2005 Notification Services 和 SQL Server 2000 Notification Services 的 2007 年时区更新
  • 无须为 SQL Server 应用任何特定的更新即可确保 SQL Server 正常工作。但是,您必须更新操作系统。此外,还必须更新与 SQL Server 交互的产品和应用程序。这些产品和应用程序可能包括 Notification Services、Windows SharePoint Services、Microsoft CRM 等。有关必须为其他 Microsoft 产品应用的更新的完整列表,请访问下面的 Microsoft 网站:

SQL Server 的时间使用情况和报告

在 SQL Server 2005 和 SQL Server 2000 中,SQL Server 数据库引擎使用以下两种形式的计时器来生成时间信息:
  • 高分辨率计时器
  • 低分辨率计时器
在高分辨率计时器中,计时器分辨率基于 CPU 的读取时间戳计数器 (RDTSC) 指令。在低分辨率计时器中,计时器分辨率基于 Microsoft Windows API 的 GetTickCount 函数。

基于计时器的各种后台任务和关键系统组件都需要依赖这些计时器才能正确运行。由于这些计时器的工作原理是基于某个特定时间进行相对测量,因此内部组件和活动将不受 2007 年 DST 更改的影响。

例如,您要执行的任务涉及下列基于计时器的活动或组件:
  • 惰性编写器、锁监视器和计划程序监视器等系统组件
  • 幻影清理和自动收缩等后台任务
  • 锁和闩锁等基于超时的资源
  • SQL Server 代理作业和维护计划等计划的活动
  • WAITFOR 语句等系统语句。
SQL Server 还会生成可用于外部组件和应用程序的时间信息。此时间信息从 Windows 操作系统检索而来。因此,只要操作系统返回的时间值正确,该时间信息就是准确的。

例如,您要执行的任务涉及下列外部组件和应用程序:
  • SQL 事件探查器或 SQL 事件探查器事件列,例如各种事件的“开始时间”、“结束时间”和“持续时间”列
  • 各种日志(例如 SQL Server 错误日志、事件日志和系统表)中报告的时间信息
  • GetDate 函数和 GetUtcDate 函数等系统函数。
假设存在以下情况。您使用 SQL 事件探查器创建了一个 SQL Server 跟踪文件。该跟踪文件记录了一个在 2007 年 3 月 DST 时间更改之前开始并于 2007 年 3 月 DST 时间更改之后完成的查询。在此情况下,时间信息将准确无误,而不受 DST 更改的影响。
下面是该跟踪文件的示例输出:
EventSequence  EventClass         TextData              StartTime                EndTime                  Duration156            Sql:StmtStarting   Select * From Table1  2007-03-11 01:59:57.187157            Sql:StmtCompleted  Select * From Table1  2007-03-11 01:59:57.187  2007-03-11 03:00:07.187  9987
与上面类似,下面也是一个跟踪文件的示例输出,该跟踪文件记录了在 2007 年 11 月 DST 时间更改期间发生的一个查询:
EventSequence  EventClass         TextData              StartTime                EndTime                  Duration178            Sql:StmtStarting   Select * From Table1  2007-11-04 01:59:54.967179            Sql:StmtCompleted  Select * From Table1  2007-11-04 01:59:54.967  2007-11-04 01:00:05.030  10055

SQL Server 中与 DST 相关但不特定于 2007 年 DST 更改的已知问题

DateDiff 和 DateAdd 日期和时间函数不能感知 DST

当使用 Transact-SQL 语句并基于系统提供的日期和时间函数执行时间计算时,必须仔细研究这些语句。具体而言,如果在应用程序逻辑中用硬编码编写了 DST 时间,则 DateDiffDateAdd 系统函数将无法感知 DST。

例如,当应用程序运行下列语句计算时间差时,该计算将基于旧的 DST 时间。请注意,根据 2007 年的新 DST 制度,DST 的开始日期为 2007 年 3 月 11 日。但是,在旧的 DST 制度下,DST 的开始日期将为 2007 年 4 月 1 日。
DECLARE @starttime datetimeDECLARE @endtime datetimeSELECT @starttime = GetDate() -- returns '2007-03-11 1:59:50.000'WAITFOR DELAY '00:00:30'SELECT @endtime = GetDate()   –- returns '2007-03-11 3:00:20.000' If @starttime < '2007-04-01 3:00:00.000' And    @endtime > '2007-04-01 1:59:59.000'	SELECT (cast((DATEDIFF(s, @starttime, @endtime)) as int) - 3600) AS TimeDiffInSecsElse	SELECT cast((DATEDIFF(s, @starttime, @endtime)) as int) AS TimeDiffInSecsGo
当您运行这些语句时,将收到以下结果:
TimeDiffInSecs -------------- 3,630
由于 DateDiff 系统函数不能感知 DST,因此这些语句返回 3,630 秒而不是 30 秒。

在此类情况下,要更正时间计算,请使用 GetUtcDate 函数代替 GetDate 函数。GetUtcDate 函数会返回当前的 UTC 时间。当前的 UTC 时间是根据运行 SQL Server 的计算机操作系统中的当前本地时间和时区设置得出的。

下面是已修改的可以正常使用的语句:
/*-------------------------------------------------------	  GetDate()		  GetUtcDate()datetime  2007-03-11 1:59:50.000  2007-03-11 09:59:50.000datetime  2007-03-11 3:00:20.000  2007-03-11 10:00:20.000-------------------------------------------------------*/DECLARE @starttime datetimeDECLARE @endtime datetimeSELECT @starttime = GetUtcDate() -- returns '2007-03-11 9:59:50.000'WAITFOR DELAY '00:00:30'SELECT @endtime = GetUtcDate()   –- returns '2007-03-11 10:00:20.000'  SELECT DATEDIFF (s, @starttime, @endtime) AS TimeDiffInSecsGo
当您运行这些语句时,将收到如下所示的正确结果:
TimeDiffInSecs -------------- 30

DST 结束日期对计划的 SQL Server 代理作业的影响

假设存在以下情况。您计划了一个 SQL Server 代理作业来打印当前本地时间。该作业每 15 分钟运行一次。当 DST 更改在 2007 年 11 月发生后,SQL Server 代理将自动跟踪该 DST 更改。SQL Server 代理基于操作系统执行其跟踪任务,然后正确更新该作业的下一次计划的运行。

下面是该作业的示例输出:
Job 'Daylight Savings Job 1' : Step 1, 'step 1' : Began Executing 2007-03-11 01:30:00CurrentTime    2007-03-11 01:30:00.343Job 'Daylight Savings Job 1' : Step 1, 'step 1' : Began Executing 2007-03-11 01:45:00CurrentTime    2007-03-11 01:45:00.343Job 'Daylight Savings Job 1' : Step 1, 'step 1' : Began Executing 2007-03-11 03:00:00CurrentTime    2007-03-11 03:00:00.357Job 'Daylight Savings Job 1' : Step 1, 'step 1' : Began Executing 2007-03-11 03:15:00CurrentTime    2007-03-11 03:15:00.357
在此示例中,该作业的运行时间 2007 年 3 月 11 日 02:00:00 与 2007 年 3 月 11 日 03:00:00 之间应差一个小时。

但存在一个已知问题:在 2007 年 11 月 DST 更改发生时,计划的 SQL Server 代理作业不能运行一个小时。在 2007 年 11 月 4 日,当时钟从凌晨 2:00 更改回凌晨 1:00 后,SQL Server 代理作业将跳过一小时并等到凌晨 2:00 再开始下一次运行。这是一个已知问题。此问题在 2007 DST 之前的约定中便已出现。它不是因 2007 年 DST 更改导致的。

下面是该作业的示例输出:
Job 'Daylight Savings Job 1' : Step 1, 'step 1' : Began Executing 2007-11-04 01:30:00CurrentTime    2007-11-04 01:30:00.343Job 'Daylight Savings Job 1' : Step 1, 'step 1' : Began Executing 2007-11-04 01:45:00CurrentTime    2007-11-04  01:45:00.343one hour plus 15 minutes gap here */Job 'Daylight Savings Job 1' : Step 1, 'step 1' : Began Executing 2007-11-04 02:00:00CurrentTime    2007-11-04 02:00:00.357Job 'Daylight Savings Job 1' : Step 1, 'step 1' : Began Executing 2007-11-04 02:15:00CurrentTime    2007-11-04 02:15:00.357
请注意,在作业的示例输出中,该作业的运行时间 2007 年 11 月 4 日 01:45:00 与 2007 年 11 月 4 日 02:00:00 之间相差一小时十五分钟。此行为可能会影响复制代理作业、备份作业、日志传送作业和在 SQL Server 中调度的其他作业。
属性

文章 ID:931975 - 上次审阅时间:11/20/2007 17:49:02 - 修订版本: 3.4

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL 2005 Server Enterprise, Microsoft SQL Server 2005 Standard X64 Edition, Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems, Microsoft SQL Server 2005 Enterprise X64 Edition, Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems, Microsoft SQL 2005 Server Workgroup, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server 2000 标准版, Microsoft SQL Server 2000, Workgroup Edition, Microsoft SQL Server 2000 Developer Edition, Microsoft SQL Server 2000 Enterprise Edition, Microsoft SQL Server 2000 Personal Edition, Microsoft SQL Server 2000 Enterprise Edition 64-bit

  • kbhowto kbexpertiseadvanced kbsql2005engine kbinfo KB931975
反馈