2013-07-28 66 views
18

我有在我使用的MySQL的應用程序。我有一份報告,記錄了過去24小時的記錄。我使用了查詢:記錄從昨天在postrgesql

WHERE (DATE_SUB(CURDATE(), INTERVAL 1 DAY) <= FROM_UNIXTIME(`workorder`.`CREATEDTIME`/1000)) 

現在我必須使用PostgreSQL並且不知道如何創建最近24小時的報告。 你們能幫忙嗎?

回答

34
WHERE workorder.createdtime > current_date - 1  -- Yesterday and today 

WHERE workorder.createdtime > current_timestamp - interval '1 day' -- last 24hr 
+1

我有一個消息:ERROR:運營商不存在:BIGINT>時間戳和時區 – Krokodyle

+0

@Krokodyle這個錯誤意味着你的'workorder.createdtime'是'bigint'。您需要將其翻譯爲適當的「日期」或「時間戳」。 –

+0

@IgorRomanchenko我翻譯成日期。有用!感謝您的幫助 – Krokodyle

5
where workorder.createdtime >= now() - interval '24 hour' 
+3

它通常是更好地使用SQL標準的'current_date'關鍵字,而不是'now'。 –

+0

謝謝,我不是使用的是Postgres經常ufortunately –

16

> TIMESTAMP 'yesterday'

爲了方便起見,Postgres的包括幾個硬編碼值作爲special Date/Time inputs。它們包括:

  • yesterday
  • today
  • tomorrow
  • now

嘗試SELECT TIMESTAMP 'now'

例如,下面是一個查詢。

SELECT when_row_created_ 
FROM customer_ 
WHERE when_row_created_ > TIMESTAMP 'yesterday' 
ORDER BY when_row_created_ DESC 
; 

這些命令可能不適合生產代碼,但它們在開發中確實很方便。閱讀文檔並做一些練習,以確保您瞭解這些命令的行爲,會話的時區如何影響他們等等。

缺點包括:(a)隱含忽略時區的關鍵問題,以及(b)不是標準的SQL。

+0

出於好奇,爲什麼他們不適合生產代碼? – VillasV

+1

@VillasV首先,它忽略了時區的關鍵問題。隱含地取決於會話的當前時區。最好是明確的,並在你的代碼中指定時區。 –