感谢前面的问题。。。
我有一个更简单的OR语句。
问题是,我如何将其更改为中间值而不是IN?
TO_DATE(TO_CHAR(TO_DATE(''19700101'',''yyyymmdd'') + + (FLOOR(ph.change_date/24/60/60)))) IN (''23-DEC-2020'', ''29-DEC-2020'')
所以我想说,在2020年12月23日和20年12月29日之间,包括两者?
感谢
如果您想在change_date
列上使用索引,请对文字值执行转换,并将其转换为epoch时间(而不是将列的epoch时间转换为日期,这将不允许您在列上使用正常索引(:
ph.change_date BETWEEN ( DATE '2020-12-23' - DATE '1970-01-01' ) * 86400
AND ( DATE '2020-12-29' - DATE '1970-01-01' ) * 86400 + 86399
change_date
似乎是Unix时间戳格式——自1970-01-01以来的秒数。我建议通过将常数值转换为相同的格式来进行比较:
where ph.change_date >= (date '2020-12-23' - date '1970-01-01') * 24 * 60 * 60 and
ph.change_date < (date '2020-12-30' - date '1970-01-01') * 24 * 60 * 60
请注意,这对索引(和分区(是友好的。第二个比较是下一个天的<
,以获得全天。
如果您需要将列处理为";真实的";日期,您可以添加一个计算列
alter table t add column change_date_date date generated always as
(cast(date '1970-01-01' as timestamp) + change_date * interval '1' second);
然后,您可以引用change_date_date
,甚至可以在其上定义一个索引
您可以使用between关键字来完成此操作。
例如:
to_date('2021.01.06', 'yyyy.mm.dd') between to_date('2021.01.01', 'yyyy.mm.dd') and to_date('2021.01.31', 'yyyy.mm.dd')
我想我们可以试试这个
where <expression>
between TO_DATE('23-DEC-2020','DD-MON-YYYY') and
TO_DATE('29-DEC-2020','DD-MON-YYYY')
您可以将历元时间(ph.change_date
(转换为日期,然后进行如下比较:
Date'1970-01-01' + FLOOR(ph.change_date/24/60/60) -- considering that change_date is epoch time
between date'2020-12-23' and date'2020-12-23'