Oracle SQL 开发人员
Posted
技术标签:
【中文标题】Oracle SQL 开发人员【英文标题】:Oracle SQL deveoper 【发布时间】:2016-08-08 09:00:46 【问题描述】:我需要制作一个自动时间系统。我想知道哪个 SHIPPING1, SHIPPING 有很多卡车,每辆卡车将在装卸码头停留 30 分钟, 例如。 :
运输 1 : 3 卡车
truck Time
----- -----
truck1 11.00,
truck2 11.30.
truck3 12.00
如果我输入了卡车 1 的时间,那么卡车 2 将分配到之后的 30 分钟,以此类推。
是否可以为此制作自动序列?
【问题讨论】:
欢迎来到 SO。在这里您可以找到有关 How to Ask 以及如何构建 minimal reproducible example 的信息 【参考方案1】:使用排序器的解决方案:
CREATE SEQUENCE TRUCK_SEQUENCE MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 0 CACHE 20 NOORDER NOCYCLE;
SELECT 'NEXT_CAR',
TO_CHAR(TO_DATE('08.08.2016 10:00', 'dd.mm.yyyy hh24:mi:ss')+1/24/60*30*TRUCK_SEQUENCE.NEXTVAL, 'dd.mm.yyyy hh24:mi:ss')
FROM DUAL;
缺点:一旦您从音序器中拉出,该时间框架就会丢失。这意味着,例如,如果您决定在 11:00 不加载汽车 3(从表中删除)但要加载汽车 4(另一个插入),您将得到 11:30。这是音序器的实际功能。
使用表中最大时间的解决方案:
WITH LOAD_TIMES AS
(SELECT 'TRUCK1' AS CAR,
TO_DATE('08.08.2016 10:00', 'dd.mm.yyyy hh24:mi:ss') AS TIME
FROM DUAL
)
SELECT 'TRUCK2',
TO_CHAR(MAX(TIME)+1/24/60*30, 'dd.mm.yyyy hh24:mi:ss')
FROM LOAD_TIMES;
缺点:您每次都查询整个表以找到最大使用时间,然后增加它。
所有解决方案通用:
--This is basic offset (date to start with)
TO_DATE('08.08.2016 10:00', 'dd.mm.yyyy hh24:mi:ss')
【讨论】:
没错,我在这个解决方案的缺点部分也说过。请注意原始请求,但是 是否可以为此进行自动排序?如果我想做这样的事情,我会先查看并尝试找到间隙(未被占用)并且不小于当前 sysdate,但这比要求的要复杂得多。要求很模糊。 我们知道什么是“自动序列”吗?我当然不会。【参考方案2】:您可以在insert
语句中尝试类似的操作,而不是使用sequence
。
考虑TO_DATE('08.08.2016 10:00', 'dd.mm.yyyy hh24:mi:ss')
是shipping1
的初始时间
INSERT INTO table1
(shipping_number, truck_number, truck_time)
VALUES ('shipping1', 'truck3',
(SELECT count(truck_number)
FROM table1
group by shipping
WHERE shipping_number='shipping1')*30/(24*60)+TO_DATE('08.08.2016 10:00', 'dd.mm.yyyy hh24:mi:ss')));
【讨论】:
以上是关于Oracle SQL 开发人员的主要内容,如果未能解决你的问题,请参考以下文章
长期 Oracle 开发人员/DBA 学习 SQL Server - 书籍推荐?