【问题标题】:Query to find extract time between查询以查找之间的提取时间
【发布时间】:2020-09-22 10:07:29
【问题描述】:

我是 SQL 初学者,需要帮助才能在 00.00.00 到 06.00.00 之间在我们的 WMS 中获取一些事务,但无法使其正常工作。

这就是我已经走了多远,

SELECT cast(datreg as time) [time], logguser, l16lcode, partno, l16qty, datreg
FROM L16T3
WHERE datreg > '0000-00-00 00:00:00' 
AND datreg < '9999-99-99 06:00:00'
AND L16T3.l16lcode = 2

我不知道要写什么才能仅在 24.00-06.00 之间获取交易

(使用 SQL Server 2012)

最好的问候

【问题讨论】:

  • 提示:首先考虑将您的数据转换为time。但是,您在那里的第二个日期无效,因为任何日历中都没有 99 天或 99 个月。
  • 或者从 datereg 中提取小时并检查它是否在 0 和 5 之间。这是有关日期和时间函数的文档:docs.microsoft.com/de-de/sql/t-sql/functions/…
  • 感谢您的提示!这个网站很棒,答案很快!

标签: sql sql-server-2012


【解决方案1】:

试试这个条件:

WHERE DATEPART(hour, datreg) BETWEEN 0 AND 5 OR
(DATEPART(hour, datreg) = 6 AND DATEPART(minute, datreg) = 0 AND DATEPART(second, datreg) = 0)

【讨论】:

  • 我认为没有必要在精确的 6:00 时包含毫秒的小数部分。 WHERE DATEPART(hour, datreg) BETWEEN 0 AND 5 应该足够了。
  • 感谢 Thorsten 的建议,感谢您格式化 dns_nx!
  • 天啊!它的工作你真棒。现在我将研究你是如何做到的!非常感谢!我现在只有一个问题。 l16lcode 给了我所有类型的交易,而不仅仅是代码 2。为什么会这样?
  • 附注:虽然AND 确实优先于OR,但在将两者混合时我仍然总是使用括号:WHERE ... OR (... AND ... AND ...)
【解决方案2】:

我建议:

SELECT cast(datreg as time) as [time], logguser, l16lcode, partno, l16qty, datreg
FROM L16T3 l
WHERE CONVERT(time, l.datreg) >= '00:00:00' AND
      CONVERT(time, l.datreg) < '06:00:00' AND
      l.l16lcode = 2;

您也可以使用时间:

WHERE DATEPART(hour, l.datreg) >= 0 AND
      DATEPART(hour, l.datreg) < 6 AND
      l.l16lcode = 2;

但是,如果第二次是06:30:00,这就不那么容易概括了。

【讨论】:

  • 感谢您的帮助!它工作得很好,似乎有很多不同的方法可以在 SQL 中编码并获得相同的结果!
【解决方案3】:

这也许是个谎言:

SELECT IIF(CONVERT(TIME, GETDATE()) BETWEEN '00:00:00' AND '23:59:59','TRUE','FALSE');

SQLFiddle中试试上面的查询

在你的情况下,它会是这样的:

SELECT cast(datreg as time) [time], logguser, l16lcode, partno, l16qty, datreg
FROM L16T3
WHERE CONVERT(TIME, datreg ) BETWEEN '00:00:00' AND '06:00:00'
AND L16T3.l16lcode = 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2021-12-27
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多