我有一个包含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
答案 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(包括从您原始查询的错误中获取的值)。