如何计算 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

我的理解正确吗?因为我相信它不是;)

【问题讨论】:

我觉得你的理解有误;你想要的是组合和排序的OutTimeInTime 的组合列表,然后选择相邻对之间的最大差异。我不知道如何用 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 中两个特定日期之间的最长周期?的主要内容,如果未能解决你的问题,请参考以下文章

计算两个特定日期之间有多少个星期五(或任何一个)?

如何在 SQL 中每年在特定日期范围之间排除

如何计算两个日期之间的月数和天数,而不在 SQL Server 中返回负值

SQL是计算两个日期相差多少天数的函数?

计算两个日期之间的特定日期计数

如何在 oracle sql 中提取两个日期之间的天数?