如何计算 SQL 中两个特定日期之间的最长周期?
Posted
技术标签:
【中文标题】如何计算 SQL 中两个特定日期之间的最长周期?【英文标题】:How to calculate longest period between two specific dates in SQL? 【发布时间】:2020-09-09 09:48:16 【问题描述】:我的任务有问题,看起来我有一个表 Warehouse,其中包含公司库存物品的清单。这 表包含列 ItemID、ItemTypeID、InTime 和 OutTime,其中 InTime (OutTime) 指定相应项目进入(离开)仓库的时间点。我必须计算公司没有物品进出仓库的最长时间。我正在尝试以这种方式解决它:
select MAX(OutTime-InTime) from Warehouse where OutTime is not null
我的理解正确吗?因为我相信它不是;)
【问题讨论】:
我觉得你的理解有误;你想要的是组合和排序的OutTime
和InTime
的组合列表,然后选择相邻对之间的最大差异。我不知道如何用 SQL 来表达,但是......
(1) 请用您正在运行的数据库标记您的问题:mysq、oracle、sql-server... (2) 示例数据和所需结果将有助于澄清您的问题
这可以是我喜欢的 SQL,假设是 Oracle。问题是我没有样本数据,我必须在没有任何数据的情况下考虑查询来解决它。
“公司在没有物品进出仓库的情况下最长的时间”到底是什么意思?这是按项目的意思还是一般的意思? IE。这是在寻找类似“有一段时间没有物品进出 100 天”或类似“有一段时间某个特定物品在 100 天内没有移动(而其他物品当时确实有移动)之类的东西” “?
【参考方案1】:
您希望任何两个连续动作(物品进入或离开仓库)之间的间隔最大。一种方法是将输入和输出时间转换为行,然后使用lag()
获取“上一个”操作的日期。最后一步是聚合:
select max(x_time - lag_x_time) max_time_diff
from warehouse w
cross apply (
select x_time, lag(x.x_time) over(order by x.x_time) lag_x_time
from (
select w.in_time as x_time from dual
union all select w.out_time from dual
) x
) x
【讨论】:
虽然您的解释可能是正确的,但您的LAG
一次只查看生成的两个行,因此导致least(in_time, coalesce(out_time, in_time))
。我不认为这是你想要的。
@ThorstenKettner:这正是描述所说的那样,即:确定两个连续动作之间的最大差距(无论它们是进还是出,或它们相关的项目)。例如,如果不同项目有交错的输入/输出,则将它们考虑在内。
您的LAG
只查看原始行的 in_time 和 out_time。因此,它与单纯的select max(abs(out_time - in_time)) from warehouse
相同。请看这个希望能解释这一点的小提琴:dbfiddle.uk/…【参考方案2】:
可以直接在oracle中进行日期计算。 结果以天为单位计算。 如果您想在几小时内完成,请将结果乘以 24。 要计算 [day] 中的持续时间,并检查表中的所有信息:
SELECT round((OutTime - InTime)) as periodDay, Warehouse .*
FROM Warehouse
WHERE OutTime is not null
ORDER BY periodDay DESC
以 [小时] 为单位计算持续时间:
SELECT round((OutTime - InTime)*24) AS periodHour, Warehouse .*
FROM Warehouse
WHERE OutTime is not null
ORDER periodHour DESC
round() 用于删除数字。 只选择具有最长周期的记录。
SELECT *
FROM Warehouse
WHERE (OutTime - InTime) =
( SELECT MAX(OutTime - InTime) FROM Warehouse)
仅选择具有最长周期的记录,并标明周期。
SELECT (OutTime - InTime) AS period, Warehouse.*
FROM Warehouse
WHERE (OutTime - InTime) =
( SELECT MAX(OutTime - InTime) FROM Warehouse)
求最长周期时,不需要条件where OutTime is null
。
【讨论】:
【参考方案3】:SQL Server 有 DateDiff,Oracle 你可以只取一个日期和另一个日期。 代码看起来没问题。 Oracle 有一个实时 SQL 工具,您可以在其中测试浏览器中的查询,这对您有帮助。
https://livesql.oracle.com/
【讨论】:
以上是关于如何计算 SQL 中两个特定日期之间的最长周期?的主要内容,如果未能解决你的问题,请参考以下文章