【问题标题】:Filter by TO_CHAR() in the WHERE clause [duplicate]在 WHERE 子句中按 TO_CHAR() 过滤[重复]
【发布时间】:2019-12-10 22:02:06
【问题描述】:

我遇到了一些意想不到的行为,这对我来说没有任何意义。

我有一个带有TIMESTAMP(6) 列的表格。

如果我执行以下查询:

SELECT DISTINCT TO_CHAR(ssef.SS_TIMESTAMP, 'DAY') FROM SS_EDGE_FORECAST ssef

我得到以下结果:

FRIDAY
TUESDAY
SUNDAY
SATURDAY
MONDAY
THURSDAY

到目前为止一切顺利。

但是,如果我尝试通过在 WHERE 子句中指定特定工作日来过滤查询结果,则不会得到任何结果:

SELECT * FROM SS_EDGE_FORECAST ssef
WHERE TO_CHAR(ssef.SS_TIMESTAMP, 'DAY') = 'MONDAY'

这似乎是一个直接的矛盾。
为什么TO_CHAR 操作会在SELECT 子句中产生正确的结果,而在WHERE 子句中却不行?
为什么我可以选择某些内容,但不能能够过滤基于相同的项目?

【问题讨论】:

    标签: sql oracle oracle-apex to-char


    【解决方案1】:

    这里的问题是,TO_CHAR(x,'DAY') 用于星期一返回 'Monday ',最后有空格。根据 TO_CHAR 函数的文档:

    字符元素 MONTH、MON、DAY 和 DY 填充有 拖尾空格到最长的完整月份名称的宽度, 最长的缩写月份名称,最长的完整日期名称...

    如果您执行以下操作,将返回正确的结果:

    SELECT * FROM SS_EDGE_FORECAST ssef WHERE TO_CHAR(ssef.SS_TIMESTAMP, 'DAY') like 'MONDAY%'
    

    或者更好的是,TO_CHAR 函数具有所谓的格式模型修饰符,您可以使用它来删除这些尾随空格:

    SELECT * FROM SS_EDGE_FORECAST ssef WHERE TO_CHAR(ssef.SS_TIMESTAMP, 'fmDAY') = 'MONDAY'
    

    应返回所需的输出。

    TO_CHAR 和格式模型修饰符的文档: https://docs.oracle.com/database/121/SQLRF/sql_elements004.htm#SQLRF00216

    【讨论】:

      【解决方案2】:

      首先解决办法是:

      SELECT * FROM TEST1
      WHERE  TRIM(TO_CHAR(ABC,'DAY'))  = 'MONDAY'
      

      增加修剪功能。

      原因是:

      TO_CHAR(TIMESTAMP,'DAY') 将返回 9 个字符串。显然,“星期一”末尾有 3 个尾随空格

      这是测试用例:

      DB<>Fiddle

      【讨论】:

        【解决方案3】:

        这是一个空白/修剪问题。

        试试这个:

        SELECT DISTINCT TO_CHAR(sysdate, 'DAY') FROM dual ssef where TRIM(TO_CHAR(sysdate, 'DAY'))='TUESDAY';
        

        【讨论】:

          猜你喜欢
          • 2012-12-25
          • 2019-03-24
          • 1970-01-01
          • 2016-08-28
          • 2015-04-10
          • 2016-07-02
          • 2017-06-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多