【问题标题】:how to select between two separate times of the day如何在一天中的两个不同时间之间进行选择
【发布时间】:2015-12-28 17:37:05
【问题描述】:

我有一个待命名单,当天有两个人待命。第一个人是美国站,另一个人是亚洲站,以弥补时差。美国人在美国东部标准时间上午 6 点至下午 5:59 待命,亚洲人在美国东部标准时间下午 6 点至下午 5:59 待命。现在,我的表中有一个名为 Location(亚洲或美国)的列,另一列是日期,另一列是名称。现在如何在给定参数的情况下与正确的待命人员进行选择语句。

PS 通常我可以自己做,但我有脑震荡,所以我感觉有点轻浮。

【问题讨论】:

  • @Marshal:Oracle 中没有 getutcdate()
  • "America" 或 "Asia" 不足以获取正确的时区。每个大陆都有几个时区。您应该将日期和时间存储在定义为timestamp with time zone 的列中。然后你可以在不同时区之间转换回来和第四次并比较值。

标签: sql oracle


【解决方案1】:

我想通了:

DECLARE
  V_TIME date;
BEGIN
    select extract(hour from CAST(sysdate AS TIMESTAMP)) into V_TIME from dual;
    if V_TIME >= '6' and V_TIME < '18'
    then
        --insert America query here
    else
        --insert Asia query here 
    END IF;
END;

【讨论】:

  • 这是一种可怕的做法。相反,将 StartTime 和 EndTimes 转换为当前日期,并将调度表中 EndTime 小于其 StartTime 的任何行拆分为两行:一行从 {time}(包括)到第二天凌晨 12:00(不包括) 和一个从上午 12 点(含)到 {EndTime}(含)。比较计算的时间是否在这些开始时间和结束时间之间将产生结果。哦,让您的结束时间排他性 - 在数据库中设置日期范围时,必须弄乱日期精度不是一个好主意。
  • 永远不要通过 Hook 或 Crook 获得结果。采用正确的解决方案和策略。
  • 没有开始时间和结束时间,这是一个服务于多个待命时间表的表,每个时间表都有自己的约束,因此更改 DDL 并不是一个真正的选项,它是一个更大的组合模式。让应用程序解决它是我的工作。
猜你喜欢
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2012-08-02
  • 2012-08-02
相关资源
最近更新 更多