我试图在两个列之间排除在同一个月开始的查询中的结果。例如,我需要排除与benefits1相同月份开始的benefits2。benefit1_start_date和benefit2_start_date的格式是: YYYYMMDD。
到目前为止,这就是我所拥有的:
where (benefit1_start_date = (to_char(sysdate, 'YYYYMM') || '0122')) <>
(benefit2_start_date = (to_char(sysdate, 'YYYYMM') || '0122'));
如果有人能让我走上正确的方向,我会非常感激的!
发布于 2018-12-13 08:19:50
将数字日期转换为文本,然后比较年份和月份子字符串:
WHERE
SUBSTR(TO_CHAR(benefits1_start_date), 1, 6) <> SUBSTR(TO_CHAR(benefits2_start_date), 1, 6)
请注意,将日期存储为这样的数字是不典型的,您可能需要考虑将它们作为日期存储。如果您没有一个“日”组件,您可以只使用第一个作为占位符。
发布于 2018-12-13 08:25:25
据我所知,您希望删除2列benefits1_start_date和benefits2_start_date在同一个月内的记录,它们都具有YYYYMMDD格式。
它们是作为字符串存储的吗?如果是这样的话,您所需要做的就是比较前6个字符(如果需要考虑yr +月份),或者只比较5+6th字符,如果您只想检查没有年份的月份。
年份+月份:国家统计局(benefits1_start_date,1,6) <> SUBSTR(benefits2_start_date,1,6)
仅仅一个月:
超短程序(benefits1_start_date,5,2) <> SUBSTR(benefits2_start_date,5,2)
如果它们不是以字符串的形式存储,而是以日期的形式存储,那么您可以将日期转换为日期到月份并进行比较(对于yr +月份),或者通过to_char将日期转换为MM字符串,如果只想检查月份,则进行比较。
希望这能有所帮助。
发布于 2018-12-13 09:05:54
我建议你使用BETWEEN
子句。通过函数将左侧操作数转换为字符串,然后进行比较可能会对性能产生严重影响。
如果将索引table.dateColumn转换为string by to_char(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
就是你要找的东西。(不影响业绩)
https://stackoverflow.com/questions/53765970
复制