【问题标题】:Query of set time range relative to current date查询相对于当前日期设定的时间范围
【发布时间】:2013-12-26 23:09:49
【问题描述】:

我早上 6 点 30 分进来上班,需要检查从下午 5 点离开时到今天早上 6 点 30 分发生的事情。我已经使用代码从任何给定时间向后搜索 13.5 小时:

SELECT * FROM TRANSACTION_HISTORY
WHERE TRANSACTION_HISTORY.ACTIVITY_DATE_TIME > (SELECT DATEADD(hour,-13.5,(SELECT MAX (TRANSACTION_HISTORY.ACTIVITY_DATE_TIME) FROM TRANSACTION_HISTORY)))

问题是如果我稍后运行查询,我会从一开始就浪费时间,例如。如果我在早上 7 点运行查询,我只能从下午 5.30 开始得到结果。我不想每天都更改条件,而是希望能够从当天的早上 6.30 搜索到前一天的下午 5.30。这个可以吗?

【问题讨论】:

  • 这是使用 SQL Server 语法,所以我将其标记为 SQL Server。
  • 你正在运行什么版本/风格的 sql?您可以将开始日期设置在某个时间...

标签: sql sql-server date


【解决方案1】:

通常,我不建议将between 用于datetime,因为边界条件会导致混淆。我不这么认为。

这是一种方法:

SELECT *
FROM TRANSACTION_HISTORY th
WHERE th.ACTIVITY_DATE_TIME between cast(cast(getdate() -1 as date) as datetime) + 17.5/24.0
                                    cast(cast(getdate() as date) as datetime) + 6.5/24.0;

表达式cast(cast(getdate() as date) as datetime) 将日期时间值截断为午夜。作为datetime,SQL Server 允许您添加一个数字,该数字被理解为一天的一小部分。因此,17.5/24 代表“5:30”。此添加不适用于 date 数据类型。

【讨论】:

  • 太棒了,谢谢,效果很好 :) 现在如果我想将结果导出到 Excel,我可以包含在相同的查询代码中吗?我应该将此作为一个单独的问题提出吗?
  • 你应该把它作为一个单独的问题来问。
【解决方案2】:

你可以这样做。

    DECLARE @dt datetime
    DECLARE @dt1 datetime
    DECLARE @dt2 datetime

    SET @dt = CONVERT(datetime, CONVERT(VARCHAR(10), getdate(), 101 ), 101)

    SET @dt1 = dateadd(mi, 30, dateadd(hh, 6, @dt))

    SET @dt2 = dateadd(mi, -27*30, @dt1)

    SELECT @dt1 as StartDate, @dt2 as EndDate

有关此脚本的更多详细信息,您可以查看这些页面。

http://technet.microsoft.com/en-us/library/ms174450%28v=sql.105%29.aspx

http://technet.microsoft.com/en-us/library/ms186819%28v=sql.105%29.aspx

【讨论】:

  • 我也会试试这个,以了解选项,谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 2019-05-26
相关资源
最近更新 更多