【问题标题】:Oracle Time ComparisonsOracle 时间比较
【发布时间】:2012-03-26 09:19:15
【问题描述】:

Oracle (10g) 是否在此处进行了正确的 TIME 比较,还是我需要转换为十进制时间然后进行比较?例如,

IF (SELECT TO_CHAR(sysdate,'HH24:MI:SS') from dual) <= '15:00'
THEN (...)

谢谢。

【问题讨论】:

  • 这只是比较两个字符串。这甚至执行吗?它既不是 SQL 也不是 PL/SQL。试试这样的:IF SYSDATE &lt;= TRUNC(SYSDATE) + (15/24) THEN ...
  • 如果您的意思是“时间必须在在或之前下午 3 点”,那么您需要“ 下午 3 点之前”,那么您可以执行“TO_CHAR(sysdate,'HH24')

标签: sql oracle date-arithmetic to-char


【解决方案1】:

使用以下代码

SELECT TO_CHAR(SYSDATE, 'HH24MI') INTO V_SYS_TIME FROM DUAL; 如果 V_SYS_TIME 在 V1_TIME 和 V2_TIME 之间,那么 (……)

【讨论】:

  • 与:“IF TO_CHAR(SYSDATE, 'HH24MI') BETWEEN V1_TIME AND V2_TIME THEN”相同,但速度较慢
【解决方案2】:
IF (sysdate <= trunc(sysdate)+15/24)
THEN (...)

应该做的伎俩...

【讨论】:

  • +1 首先进入我的答案的最后一部分!
  • 5/8 会更好(数学专业说);-)
  • @DavidFaber,虽然你在做什么不太明显。我总是使用模数运算 mod-24 - 稍微计算一下:-),在进行小时计算时,因为很清楚发生了什么。
  • trunc(sysdate) 是否有效地创建时间“0”,将 15/24 添加到该时间,从而使时间为 15?
  • 是的。 TRUNC(date) 将日期“四舍五入”到午夜 (00:00:00)。添加 15/24 等于增加 15 小时,因此将您带到 15:00:00。
【解决方案3】:

您不能在if 语句中使用select,但可以直接与sysdate 进行比较。如果您这样做,最好使用数字而不是依赖隐式转换。你也不需要额外的时间等等。像,

begin

   if to_number(to_char(sysdate,'HH24')) <= 15 then
      -- do something
   end if;

end;

如果您确实想使用分钟,那么通过将其转换为不带冒号的字符串,您可以进行更直接的比较。只要日期/时间以 24 小时格式转换,没有额外的和反向的,年、月、日、小时等比较总是准确的,例如

begin

   if to_char(sysdate,'HH24MI') <= '1515' then
      -- do something
   end if;

end;

但是,通常最好进行日期比较,因为@cagcowboy 在我到达那里之前刚刚发布!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 2012-09-15
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2020-08-14
    • 2017-07-10
    • 2015-06-26
    相关资源
    最近更新 更多