【问题标题】:Subtract minutes from a date column based on a value in another table根据另一个表中的值从日期列中减去分钟
【发布时间】:2018-02-02 05:41:20
【问题描述】:

我正在尝试根据另一个表中的值从日期列中减去分钟。但是查询出错了。有人可以就此提出建议吗?

TABLE 1 NAME - MYTABLE1 

COLUMN NAME "IN_DATE" Data type - DATE

TABLE 2
NAME - CONFIG_TABLE
COLUMN NAME - PARAM_NAME VALUE = SUBTRACT_MINUTE_VALUE
COLUMN NAME   PARAM_VALUE  VALUE =15

SELECT IN_DATE , IN_DATE - interval (SELECT PARAM_VALUE FROM CONFIG_TABLE WHERE PARAM_NAME='SUBTRACT_MINUTE_VALUE') minute FROM MYTABLE1

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    另一种选择是使用一分钟的interval 并将其乘以存储在配置表中的数字。

    select m.in_date,
           m.in_date - (interval '1' minute * c.param_value) as result
    from mytable1 m 
      cross join config_table c on c.param_name = 'SUBTRACT_MINUTE_VALUE'
    

    【讨论】:

    • interval '1' minute * c.param_value 这很聪明!
    【解决方案2】:

    我是这样做的:分钟数除以(24 小时(一天)x 60 分钟(一小时))

    SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi';
    
    Session altered.
    
    SQL> create table config (subtract_minute_value number);
    
    Table created.
    
    SQL> insert into config values (15);
    
    1 row created.
    
    SQL> create table mytable1 (in_date date);
    
    Table created.
    
    SQL> insert into mytable1 values (sysdate);
    
    1 row created.
    
    SQL>
    SQL> select m.in_date, m.in_date - c.subtract_minute_value / (24 * 60) result
      2  from mytable1 m, config c;
    
    IN_DATE          RESULT
    ---------------- ----------------
    02.02.2018 06:56 02.02.2018 06:41
    
    SQL>
    

    [根据 Aleksej 的 ANSI JOIN 建议以及 NUMTODSINTERVAL 选项进行编辑]

    SQL> select m.in_date,
      2         m.in_date - c.subtract_minute_value / (24 * 60) result
      3  from mytable1 m join config c on 1 = 1;
    
    IN_DATE          RESULT
    ---------------- ----------------
    02.02.2018 07:51 02.02.2018 07:36
    
    SQL>
    SQL> select m.in_date,
      2         m.in_date - numtodsinterval(c.subtract_minute_value, 'minute') result
      3  from mytable1 m join config c on 1 = 1;
    
    IN_DATE          RESULT
    ---------------- ----------------
    02.02.2018 07:51 02.02.2018 07:36
    
    SQL>
    

    【讨论】:

    • 最好在ANSI SQL中展示一个解决方案,避免旧的Oracle风格
    • @Aleksej,你说的是 JOIN 吗?如果是这样,好的 - 谢谢,我添加了该选项以及另一种 NUMTODSINTERVAL 方法来获得结果。如果不是,嗯,然后呢?不过,“旧”Oracle 样式有什么问题 - 在这种情况下,它真的很简单,而 ANSI 看起来……更糟:)
    • 加入,仅此而已:)
    • 好的,解决了!
    • 我很欣赏并追随你的热情,不到两个月的时间你就超过了我:)恭喜!
    【解决方案3】:

    你也可以试试这个,

    ALTER SESSION SET NLS_DATE_FORMAT = 'MM/DD/YYYY HH:MI:SS AM';
    
    SELECT SYSDATE current_time, 
           SYSDATE - (1/24/60)*:p_min current_time_minus_mins
      FROM DUAL;
    

    【讨论】:

    • TO_CHAR()的原因是什么?
    • 以 'MM/DD/YYYY HH:MI:SS AM' 格式显示日期。如果我输入 SYSDATE,它只会以 DD-MON-YYYY 格式显示(最终)。
    • 那么你应该改变你的会话NLS_DATE_FORMAT设置
    猜你喜欢
    • 2021-03-28
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2020-01-12
    • 1970-01-01
    相关资源
    最近更新 更多