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个空格
以下是测试用例: