【问题标题】:Add a derived attribute to existing table in SQL Developer在 SQL Developer 中向现有表添加派生属性
【发布时间】:2019-12-02 13:08:40
【问题描述】:

有没有办法添加派生日期/时间列(到现有表)来保存计算的比赛运行时间。

这些值以小时为单位,四舍五入到小数点后两位。表格中有开始时间和结束时间两列。以下是我尝试的最后一个缺少表达式错误。

ALTER TABLE race
ADD race_time AS (SELECT ROUND(DATEDIFF (endtime, starttime),2)FROM race);

【问题讨论】:

  • Oracle 中没有datediff()

标签: sql oracle ddl calculated-columns


【解决方案1】:

Oracle 中没有datediff() 函数,您也不需要SELECT 语句来创建计算列:

ALTER TABLE race
  ADD race_time AS (endtime - starttime);

如果endtimestarttime 定义为timestamp,则race_time 列的类型将是interval

如果这两列是date 列,则结果将是一个数字,表示两天之间的天数

【讨论】:

    【解决方案2】:

    我已经有一段时间没有使用这个功能了,但我认为它看起来更像:

    ALTER TABLE race
    ADD race_time AS (ROUND(DATEDIFF (endtime, starttime),2))
    

    请注意,我不知道 Oracle 中的 DATEDIFF 函数 - 如果您自己没有编写此函数并且希望获取两个日期之间的小时数,它更像是:

    ALTER TABLE race
    ADD race_time AS (ROUND((endtime - starttime)*24.0,2))
    

    如果您的列是时间戳,那么在进行数学运算时将它们转换为日期可能会更容易

    https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=3ac1f46f8d7296754d14a3de6191dbe8

    【讨论】:

    • 要将答案提名为最适合您需求的答案,请单击灰色 ✔️ 标记将其变为绿色。如果答案有用,请单击?。许多答案可以被标记为有用,但只有一个可以被接受为最合适的答案。当您是新用户时,对有用答案的赞成票可能不会显示,但会在您自己的代表更高时被记录和应用
    • 谢谢,我在查询中使用了您的建议来获取之前的race_time,但现在我需要在表中使用此列来自动计算而无需硬编码。
    • 这就是我给你的?看:dbfiddle.uk/… - 我没有在比赛时间列中插入 30,当我插入两个相隔 1.25 天的日期时,它就可以解决
    • 我通过移动括号使其工作,但仍需要限制小数。在 24 之后添加 ,2 不起作用。
    • 感谢 Caius 为我指明了正确的方向。以下将小数限制如下:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多