Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按WHERE子句中的TO_CHAR()进行筛选_Sql_Oracle_Oracle Apex_To Char - Fatal编程技术网

Sql 按WHERE子句中的TO_CHAR()进行筛选

Sql 按WHERE子句中的TO_CHAR()进行筛选,sql,oracle,oracle-apex,to-char,Sql,Oracle,Oracle Apex,To Char,我遇到了一些意想不到的行为,这对我来说毫无意义 我有一个带有时间戳(6)列的表 如果我执行以下查询: SELECT DISTINCT TO_CHAR(ssef.SS_TIMESTAMP, 'DAY') FROM SS_EDGE_FORECAST ssef 我得到以下结果: FRIDAY TUESDAY SUNDAY SATURDAY MONDAY THURSDAY 到目前为止还不错 但是,如果我试图通过在WHERE子句中指定特定的工作日来过滤查询结果,则不会得到任何结果: SELECT *

我遇到了一些意想不到的行为,这对我来说毫无意义

我有一个带有
时间戳(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
子句中产生正确的结果?

为什么我可以选择某个项目,但不能基于同一个项目进行筛选?

这里的问题是,to_CHAR(x,'DAY')是指周一返回的“周一”,末尾为空。根据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_字符和格式模型修改器文档:
这是一个空白/修剪问题

试试这个:

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'
增加了微调功能

原因是:

TO_CHAR(时间戳,'DAY')将返回9个字符串。显然,“星期一”结尾处有3个空格

以下是测试用例: