【问题标题】:I am trying to display store which has been open at least two hours before current time我正在尝试显示在当前时间前至少两个小时营业的商店
【发布时间】:2015-11-23 05:30:21
【问题描述】:

谁的桌子

CREATE TABLE TOY_STORE
(
    TOY_STORE_ID        NUMBER(3)       PRIMARY KEY,
    TOY_STORE_NAME      VARCHAR2(30)    NOT NULL,
    CITY                VARCHAR2(30)    DEFAULT 'Delhi',
    PHONENUMBER         NUMBER(10)      UNIQUE NOT NULL,
    STORE_OPENING_TIME  TIMESTAMP       CHECK (EXTRACT(HOUR FROM STORE_OPENING_TIME)>=8),
    STORE_CLOSING_TIME  TIMESTAMP       CHECK(EXTRACT(HOUR FROM STORE_CLOSING_TIME)<22)
);

下面的代码有一些问题。有人可以纠正它吗?

SELECT  TOY_STORE_NAME 
FROM    TOY_STORE 
WHERE 
(
    SELECT  EXTRACT (HOUR FROM CURRENT_TIMESTAMP-STORE_OPENING_TIME) 
    FROM    TOY_STORE
)>=2;

【问题讨论】:

  • 您遇到了什么问题?如果您编辑您的问题并包含一些示例数据、您获得的结果以及您预期的结果,将会很有帮助。谢谢。

标签: sql oracle timestamp date-arithmetic


【解决方案1】:

为了比较两个日期/时间值之间的差异,我们使用 INTERVAL 数据类型。因此,您的查询可能如下所示:

select TOY_STORE_NAME
from TOY_STORE
where ( localtimestamp - STORE_OPENING_TIME) >= interval '2' hour
/

那当然是错的。因为 STORE_OPENING_TIME 是 timestamp 它包含一个日期。所以你已经正确地指出你需要从时间戳中提取小时元素。问题是您也需要将其转换为间隔。我们可以使用NUMTODSINTERVAL()

所以,要找到至少营业了两个小时的商店,你需要的是这样的

select TOY_STORE_NAME
from TOY_STORE
where NUMTODSINTERVAL(extract(hour from CURRENT_TIMESTAMP), 'Hour')  
       >= NUMTODSINTERVAL(extract(hour from STORE_OPENING_TIME)+2, 'Hour')
/

现在我们在 WHERE 子句的两边都有间隔。

请注意,使用 TIMESTAMP 来表示没有日期的时间在某些时候导致问题,因为其意图很容易被误解。更好的解决方案是将时间存储为字符串,例如“HH24:MI”,并使用日期算术来处理它。例如,

select TOY_STORE_NAME
from TOY_STORE
where to_date(to_char(sysdate, 'DD-MON-YYYY')||' '||STORE_OPENING_TIME, 'DD-MON-YYYY HH24:MI') 
                 + NUMTODSINTERVAL(2, 'Hour')  >= sysdate
/

我同意它看起来很丑,但它可以包装在用户定义的函数中。

如果 Oracle SQL 具有 TIME 数据类型(即没有日期元素),则可以避免大部分这种痛苦,但可惜它没有。

【讨论】:

    【解决方案2】:

    这里首先通过 trunc() 从时间戳字段中检索时间。然后将时间差与 2 小时间隔进行比较将帮助您检索当前时间前至少 2 小时营业的商店名称。

    select TOY_STORE_NAME
    from TOY_STORE       
    where (CURRENT_TIMESTAMP-trunc(CURRENT_TIMESTAMP)) - (STORE_OPENING_TIME-trunc(STORE_OPENING_TIME)) >= interval '2' hour;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2020-11-14
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      相关资源
      最近更新 更多