SQL。无需手动输入,即可调用午夜时间戳unix

时间:2014-07-24 12:41:08

标签: sql oracle

我有一个包含4列值的表,animal_id,food_id和timestamp。时间戳以unix时间记录数据。目前我的脚本工作正常,并生成这样的表。这一切都很棒,除了这一点,我迫使我去编辑文件,并在今天的午夜时间戳中更改每天的时间戳,这非常耗时。有没有办法在不必更新的情况下每天生成这行代码?先感谢您。我使用oracle 10g。

我想要更改的脚本中的行

时间戳在1406073600与(1406073600 + 86400)之间的时间戳

剧本

SELECT MAX(value),animal_id, food_id 
FROM farm1 
WHERE timestamp BETWEEN 1406073600 AND (1406073600 + 86400)
group by animal_id, food_id ;

表结果

MAX(VALUE)  animal_id    food_id
---------- ---------- ----------
      9302          8       9081
      8015         10       9081

2 个答案:

答案 0 :(得分:0)

解决问题的方法是将每个时间戳转换为概念日期并使用虚拟列systimestamp

SELECT MAX(value),animal_id, food_id 
FROM farm1 
WHERE TO_CHAR(timestamp, 'YYYYMMDD') = TO_CHAR(systimestamp, 'YYYYMMDD')
group by animal_id, food_id ;

答案 1 :(得分:0)

您可以使用以下命令将日期转换为Unix风格的纪元时间戳编号:

(your_date - date '1970-01-01') * 60 * 60 * 24

...因为时间戳是自1970-01-01以来的秒数。

所以昨天(你的样本似乎正在做的)运行你对所有记录的查询:

SELECT MAX(value),animal_id, food_id 
FROM farm1 
WHERE timestamp >= (trunc(sysdate - 1) - date '1970-01-01') * 60 * 60 * 24
AND timestamp < (trunc(sysdate) - date '1970-01-01') * 60 * 60 * 24
GROUP by animal_id, food_id ;

BETWEEN具有包容性,因此可以捕获两个中午,这可能会导致两天内包含价值。运行,或倾斜其中一个的结果。我已将其更改为明确的>=<,以使其具有包容性。或者你可以从当天晚些时候减去1,使其成为23:59:59。

SQL Fiddle demo(包括从您原始查询的错误中获取的值)。