【问题标题】:DATEADD() function to find values in this business dayDATEADD() 函数查找本工作日的值
【发布时间】:2011-07-19 08:52:28
【问题描述】:

如何使用 SQL DATEADD() 函数查找该工作日的记录?例如:

SELECT * FROM records r
WHERE r.creationTime <= GETDATE()
  AND r.creationTime >= DATEADD(dd, -1 * hoursFromStartOfThisDay, GETDATE())

“hoursFromStartOfThisDay”正是它所说的。

注意:我说的是工作日,所以从周一到周五上午 9 点到下午 5 点,如果这很重要的话。

谢谢各位!

编辑:我也希望在一周/一个月的开始时应用解决方案,也可能是小时。

编辑:因此,如果一条记录是在 18/07/2011 08:55:00 创建的,而另一条记录是在 18/07/2011 09:05:00 创建的,我希望第二条记录被查询拾取并且不是第一个。但是,如果当前的 GETDATE() 是 18/07/2011 09:15:00,那么它会变得很棘手。

添加AND r.creationTime &gt;= '9am'怎么样?

【问题讨论】:

  • “hoursFromStartOfThisDay”是什么意思? 这个名字对我们没有用处。时间的数据类型? “时间”?由于不清楚,请提供示例数据
  • 您是否试图找到一个计算来给出“今天上午 9 点”?您想如何对待以下时间? 23:59, 00:00, 00:01, 08:59, 17:01?
  • -1 您的问题更新使这比以前更加模糊
  • creationTime &gt; GETDATE() 真的可以在您的架构中使用吗?
  • gbn 还算不错,但 sll 明白了,所以不可能那么模糊。

标签: sql sql-server sql-server-2005 dateadd getdate


【解决方案1】:

您真的需要hoursFromStartOfThisDay 变量吗? 如果您的一天是静态的,从 9 点到 5 点,您可以只使用这个静态范围:

-- cache current date to avoid multiple calls
DECLARE @startOfADay INT
DECLARE @dayLength INT
DECLARE @currentDate DATETIME
SET @currentDate = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SET @startOfADay = 9
SET @dayLength = 8

SELECT 
   ...
FROM
   ...
WHERE ...
BETWEEN 
      DATEADD(hh, @startOfADay, @currentDate) 
      AND 
      DATEADD(hh, @startOfADay + @dayLength, @currentDate)

【讨论】:

  • 我想到了这一点,这样就可以了。但是,我将其用作基本示例,然后将解决方案用于查找从周/月开始到“现在”之间的记录。我将编辑问题以包含它。
  • 很高兴听到,所以我回答了你的问题?
  • 嗨,sll,感谢您的代码。现在试试。我相信你已经回答了我的问题,是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多