【问题标题】:DISTINCT date value in ORA-01791: not a SELECTed expressionORA-01791 中的 DISTINCT 日期值:不是 SELECTed 表达式
【发布时间】:2017-02-04 20:28:36
【问题描述】:

我想使用 oracle 查询从订单表中获取唯一的日期值。我得到了

ORA-01791: 不是 SELECTed 表达式

错误,当我尝试以下查询时

SELECT DISTINCT (TO_DATE(LAST_INSERT_TIMESTAMP, 'YYYY-MM-DD HH24:MI'))
    FROM ORDER
   WHERE LAST_INSERT_TIMESTAMP IS NOT NULL
ORDER BY LAST_INSERT_TIMESTAMP DESC;

【问题讨论】:

  • 你确定你有一个名为 ORDER 的表吗?
  • 您真的将时间戳存储为字符串吗?你不应该。
  • distinctNOT 一个函数。将列列表放在括号内没有意义(或区别)
  • 那你用错了函数。 TO_DATE 将字符串转换为日期时间,因此您的表达式首先默默地将LAST_INSERT_TIMESTAMP 转换为字符串,从而依赖于可能失败的当前设置。请改用TRUNC(LAST_INSERT_TIMESTAMP, 'MI')

标签: sql oracle


【解决方案1】:

LAST_INSERT_TIMESTAMP 不在您的结果列表中,因为您已将带有DISTINCT 的行聚合为截断的时间戳。您只能按此订购。

SELECT DISTINCT TRUNC(LAST_INSERT_TIMESTAMP, 'MI')
    FROM ORDER
   WHERE LAST_INSERT_TIMESTAMP IS NOT NULL
ORDER BY TRUNC(LAST_INSERT_TIMESTAMP, 'MI') DESC;

如果您不想重复表达式,请使用位置排序:

ORDER BY 1 DESC;

或者为表达式使用别名:

SELECT DISTINCT TRUNC(LAST_INSERT_TIMESTAMP, 'MI') AS LAST_INSERT
    FROM ORDER
   WHERE LAST_INSERT_TIMESTAMP IS NOT NULL
ORDER BY LAST_INSERT DESC;

请注意,我将您的 TO_DATE 替换为适当的 TRUNC,因为您要做的只是截断时间戳,而不是与字符串相互转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    相关资源
    最近更新 更多