在 WHERE 子句中按 TO_CHAR() 过滤

Filter by TO_CHAR() in the WHERE clause

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

我有一个 table 和 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 子句中却不会?
为什么我能够 select 一些东西,但是 NOT 能够 filter在同一项目上?

这里的问题是,TO_CHAR(x,'DAY') 是针对周一 returning 'Monday ' 的,最后是空白。根据 TO_CHAR 函数的文档:

The character elements MONTH, MON, DAY, and DY are padded with trailing blanks to the width of the longest full month name, the longest abbreviated month name, the longest full date name...

正确的结果应该是 return如果你这样做:

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'

应该return想要的输出。

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

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

试试这个:

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

首先解决方案是:

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

Trim功能已添加

原因是:

TO_CHAR(TIMESTAMP,'DAY') 将 return 9 个字符的字符串。显然,'Monday'

末尾有 3 个空格

这里是测试用例:

DB<>Fiddle