如何在SQL中比较2转换日期

时间:2018-12-13 16:15:53

标签: sql

我试图排除查询的结果,该结果从同一月份的两列之间开始。例如,我需要排除与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'));

如果有人能把我带向正确的方向,我将不胜感激!

3 个答案:

答案 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

将是您想要的。 (不影响性能)