【问题标题】:Getting time between two dates获取两个日期之间的时间
【发布时间】:2019-06-22 03:04:47
【问题描述】:

我有下表:

Id  Start                End
1   2019-01-28 07:00:00  2019-01-28 17:00:00
2   2019-01-28 17:01:00  2019-01-28 02:00:00

我想要做的是检查我何时运行查询,如果当前时间介于 id 1 或 2 之间。这是我的查询。

SELECT Id FROM MyTableName 
WHERE CONVERT(varchar(5), GETDATE(), 108)
BETWEEN CONVERT(varchar(5), Start, 108) AND
CONVERT(varchar(5), End, 108)

如果我从 07 小时到 17 小时(ID 1)运行我的查询,目前工作正常,但是当我在 17:01 之后尝试它时,查询没有显示任何结果。使用我的查询,我发现这是因为 02:00 小时(id 2,02:00 表示凌晨 2 点)。

我该如何处理?

【问题讨论】:

  • 02:00 真的意味着凌晨 2 点。您应该将结束时间设为 2019-01-29 02:00:00。
  • @rcs 主要问题是,在我的桌子上,我不会有所有日子的开始和结束日期时间。我的表只会包含两行以上的内容。如果我按照你说的做,查询明天、下周、下个月等会起作用吗?
  • 没有。下个月,您需要将开始日期和结束日期更新为下个月。 2 月现在没有办法,您的表格内容仍在 1 月,您希望它们能够正常工作。
  • 20190128 17:02 不在20190128 17:01 20190128 02:00 之间。该查询确实有效,因为它不会显示任何行作为返回。问题是为什么你说查询不起作用?
  • @PhamX.Bach 你说得对,我编辑了我的问题,所以现在我说这不会显示任何结果,因为我希望如果我在晚上 8 点运行查询,查询会返回 ID 2 .

标签: sql sql-server sql-server-2012 sql-server-2014


【解决方案1】:

根据您在 cmets 中提供的反馈,我认为实现您想要的最佳方法实际上是在一个查询中实现,而无需使用表。

SELECT CASE 
WHEN (GETDATE() > SMALLDATETIMEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE()), 7, 00)) AND (GETDATE() < SMALLDATETIMEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE()), 17, 00)) THEN 1 
WHEN (GETDATE() > SMALLDATETIMEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE()), 4, 00)) AND (GETDATE() < SMALLDATETIMEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE())+1, 2, 00)) THEN 2
ELSE NULL END AS ID

如果时间在 07:00 和 17:00 之间,上面的查询将返回 ID 1,如果时间在 17:00 和 02:00(第二天)之间,则返回 2,如果时间在任一时间之外,则返回 NULL这些窗口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    相关资源
    最近更新 更多