【问题标题】:SQL Date Time AutomationSQL 日期时间自动化
【发布时间】:2016-04-04 15:52:56
【问题描述】:

早上好,

我正在尝试删除几个查询中的一些手动输入,这些查询每周检索通过我们的界面传输的大量结果。即日期时间函数和几个case函数。我想先处理日期时间,因为案例陈述不需要每周更新一次,只有在添加新客户时才需要。

过去我们一直在手动编辑数据以选择最近 7 天的数据。

例子:

    WHERE (MessageReceivedDateTime >= '12/23/15 05:00' 
    AND MessageReceivedDateTime < '12/28/15 05:00') 

我能够使用下面建议的代码来检索我们数据库中最近 7 天的数据,并且其中一天似乎缺少一些值。我认为这是因为我在查询中没有时间偏移量。

建议:

    (MessageReceivedDateTime between DateAdd(DD,-7,GETDATE() ) and GETDATE()) 

更新它的部分目标是确保我们不需要每周手动编辑日期/时间。我进行了谷歌搜索并搜索了论坛,但没有看到任何特定于这个问题的内容。任何额外的帮助/解释将不胜感激。

如果我错误地选择了 tSQL,我也想提前道歉,我的 SQL 培训一直在工作,我们有 Oracle 和 Microsoft SQL Server Management Studio,我在 Management Studio 中运行上述查询并相信它们成为 tSQL。

---- 编辑以提供最终解决方案----

    DECLARE @StartTime DATETIME = (DATEADD(Day, 0, DATEDIFF(Day, 0, GetDate())-7));
    DECLARE @EndTime DATETIME = DATEADD(Day, 0, DATEDIFF(Day, 0, GetDate()));
   SET @StartTime = DATEADD(hh,(-dbo.fn_GetUTCOffset(@StartTime)),@StartTime);
   SET @EndTime = DATEADD(hh,(-dbo.fn_GetUTCOffset(@EndTime)),@EndTime);

    WHERE MessageReceivedDateTime >= @StartTime
           AND MessageReceivedDateTime < @EndTime

在我的特殊情况下,我在最后一天唯一需要担心的是确保考虑到我的 UTC 偏移量。我使用我们设置的 -dob.fn 处理。它会根据一年中的时间增加 5 或 4。

【问题讨论】:

  • 似乎缺少哪些值
  • 飞盘,我比较了两个查询,并且 DateAdd 之间在查询的第一天遗漏了大约 5,000 个结果。我本来希望这些数字更接近实际。虽然我认为 Steven 使用日期时间对 Getdate 函数的解释是减去 7 天,但将其保留为清晨,我希望检索的是整个天的值,以便比较两个查询是否工作相似。
  • 但是您甚至没有在 > 12/23/15 05:00 检索一整天
  • 飞盘,通常在我们的例子中,我们使用 05:00 作为 UTC 偏移量,现在显然是午夜,我假设没有这个偏移量它会返回一整天,不知道为什么我想老实说。这解释了我之前在 Gordon 的线程上的 cmets。

标签: sql-server-2008 tsql datetime


【解决方案1】:

GETDATE 函数返回一个用于 NOW 的 DATETIME。像您一样减去 7 天,将返回 7 天前的日期,但现在的时间。

示例: 现在:2015-12-30 12:37:45.143 添加日期 - 7:2015-12-23 12:37:45.143

如果您想要一天中的特定时间,那么您将需要做更多的工作。

DECLARE @MyTime TIME = '05:15'  --This can be changed to whatever time you would like.
DECLARE @StartTime DATETIME = CONVERT(VARCHAR(10), CAST(GETDATE() AS DATE)) + ' ' + CONVERT(VARCHAR(10), @MyTime)
DECLARE @EndTime DATETIME = CONVERT(VARCHAR(10), CAST(DATEADD(DAY, -7, GETDATE()) AS DATE)) + ' ' + CONVERT(VARCHAR(10), @MyTime)

它可以用在查询中的 where 子句中,比如

  (MessageReceivedDateTime between @StartTime and @EndTime)

【讨论】:

  • 奇怪的是,GetDate() 在查询中被视为runtime constant function。 (Ref.) 在变量中捕获当前日期/时间然后根据需要使用该值通常更清晰。这在多个语句中更为重要,例如在存储过程中,值可能会从一个语句更改为下一个语句。
  • @Steven,感谢您的帮助。我对您的答案进行了修改以做我需要的事情。
【解决方案2】:

您可以通过转换为 date 来删除时间组件来修复您的第二个查询:

(MessageReceivedDateTime between DateAdd(day, -7, CAST(GETDATE() as DATE)) and 
                                 CAST(GETDATE() as DATE)
) 

但是,我不会为此使用between。更像是:

(MessageReceivedDateTime >= DateAdd(day, -7, CAST(GETDATE() as DATE))
 MessageReceivedDateTime < CAST(GETDATE() as DATE)
) 

我不确定值的边界是什么,因此您可能需要添加或减去“1”。

【讨论】:

  • 使用第二个代码似乎可以让我多花一天时间,而不是提前 7 天,而是从前一天开始,在这种情况下是 22 天。然而,其他 7 天的总数符合我的预期。
  • @J.E.Flint。 . .日期时间在列中的存储方式是否存在时区问题?
  • @GordonLinoff 我们确实具有在查询时抵消夏令时的功能,但目前我们所有的数据时间都存储在 UTC 日期/时间中。我相信我只需要使用一个命令来只抓取从午夜到 7 天结束的时间,而不是与现在相关的时间。
猜你喜欢
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 2011-08-10
  • 1970-01-01
相关资源
最近更新 更多