在Oracle中的两个Unix日期之间



感谢前面的问题。。。

我有一个更简单的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'

最新更新