我试图排除查询的结果,该结果从同一月份的两列之间开始。例如,我需要排除与Benefits 2在同一月份开始的Benefits1。 Benefit1_start_date和Benefit2_start_date的格式为:YYYYMMDD。
这是我到目前为止所拥有的:
where (benefit1_start_date = (to_char(sysdate, 'YYYYMM') || '0122')) <>
(benefit2_start_date = (to_char(sysdate, 'YYYYMM') || '0122'));
如果有人能把我带向正确的方向,我将不胜感激!
答案 0 :(得分:0)
将数字日期转换为文本,然后比较年和月子字符串:
WHERE
SUBSTR(TO_CHAR(benefits1_start_date), 1, 6) <> SUBSTR(TO_CHAR(benefits2_start_date), 1, 6)
请注意,将日期存储为这样的数字是非典型的,您可能需要考虑将它们存储为日期。如果没有日程,则可以将第一个用作占位符。
答案 1 :(得分:0)
据我了解,您想消除2列Benefits1_start_date和Benefits2_start_date在同一个月内且两者的格式均为YYYYMMDD的记录。
它们是否存储为字符串?如果是这样,那么您所要做的就是比较前6个字符(如果需要考虑yr + month),或者如果只想查看不带年份的月份,则仅比较5 + 6个字符。
年+月: SUBSTR(benefits1_start_date,1,6)<> SUBSTR(benefits2_start_date,1,6)
一个月:
SUBSTR(benefits1_start_date,5,2)<> SUBSTR(benefits2_start_date,5,2)
如果它们不是存储为字符串而是存储为日期,则可以将日期TRUNC转换为月份并进行比较(yr + month),或者通过to_char将日期转换为MM字符串,然后比较是否只想检查一个月。
希望这会有所帮助。
答案 2 :(得分:0)
我建议您使用BETWEEN
子句。按功能将LEFT边操作数转换为字符串,然后进行比较会严重影响性能。
如果通过to_char(table.dateColumn)将索引的table.dateColumn转换为字符串,则oracle无法再在列上使用定义的索引。
您所需的查询:
where to_char(benefit1_start_date, 'YYYYMM') != to_char(benefit2_start_date, 'YYYYMM')
但是
select * from table1
where months_between(benefit1_start_date, benefit2_start_date) not between -1 and 1
将是您想要的。 (不影响性能)