2014-07-24 57 views
0

我有一個4列值,animal_id,food_id和timestamp的表。時間戳將數據記錄在unix時間。目前我的腳本工作正常,並生成這樣的表格。這一切都很棒,但這一切都迫使我去編輯文件,並改變今天午夜時間戳的每一天的時間戳,這非常耗時。有沒有辦法爲每一天生成這行代碼,而無需更新它?先謝謝你。我使用oracle 10g。SQL。呼叫午夜時間戳unix,無需手動輸入

在我想改變

WHERE時間戳之間1406073600 AND(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

爲什麼你把它作爲一個Unix時間戳存儲,而不是一個本地'DATE'類型? –

回答

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(包括從原始查詢中錯誤選取的值)。

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 ; 
+0

to_char創建字符串,而不是日期。 –

+0

從語義上講,它也創建日期。 –

+0

似乎不起作用。這仍然需要我輸入數據,如20140722,其中不是我的目標。我的目標是讓我不必這樣做。 – Ray