2011-08-24 40 views

回答

3

這SQLite的:

date(date, '-' || strftime('%w', date) || ' days') 

是,據我所知,減去一天在星期幾的天數(即0表示星期日,1表示星期一,...),然後將結果轉換爲date;詳情請參閱date function reference

我認爲相當於對PostgreSQL是:

d - extract(dow from d)::int 

其中d是你的日期;從日期中減去整數減去該天數。如果d是時間戳,那麼您可能需要添加一些強制轉換。還有date_trunc('week', 'd'),但是從星期一開始計算日期,所以你會選擇一個。


下面是與date變量通過d更換,以避免與date()功能混亂的SQLite的快速崩潰:

所有的
date(d, '-' || strftime('%w', d) || ' days') 

首先,||是標準的SQL字符串連接運算符。 strftime function是來自POSIX的通用日期和時間格式化程序; %w格式說明符表示「星期幾爲週日爲零的數字」;所以strftime電話會在星期日爲您提供0,星期一爲1,星期六爲您提供6。如果d是星期二,那麼strftime通話將產生2和整件事結束了:

date(d, '-2 days') 

指定SQLite date function修飾符有不同的形式,但'-2 days'意味着正是你會認爲:減2天從d。總體結果是,您得到d被截斷爲一週(週日被認爲是一週的第一天)。

在PostgreSQL的一面:

d - extract(dow from d)::int 

我們可以extract啓動; extract用於提取日期或時間的特定部分,而dow表示「星期幾爲週日爲零的數字」。聽起來有點熟?然後,::int將DOW編號轉換爲整數,因爲DOW實際上是作爲雙精度值出現的,並且在PostgreSQL中沒有爲從日期中減去雙精度值而定義的運算符;演員還可以用標準格式寫成cast(x as int)。當你從PostgreSQL的日期中減去一個整數時,你會減去那麼多天;你可以通過說- interval '3 days'之類的東西來更加明確,但這樣會增加更多的噪音,所以我選擇了簡單。如果是星期二,那麼我們的PostgreSQL的版本是這樣的:

d - 2 

,這就是一樣:

d - interval '2 days' 

和減法後,我們會在週日回來的。 PostgreSQL中也有date_trunc,但是會截斷到週一和週日。

+0

你能帶我通過sqlite語句的邏輯,然後通過postgres的邏輯嗎?我在參考之後遇到困難。 – locoboy

+0

@ cfarm54:我爲你增加了一些步行。 –

2

%w是一週中的一天,從星期日= 0,同PostgreSQL的DOW一個數字:SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');http://www.postgresql.org/docs/current/static/functions-datetime.html

的字符串操作應該是非常簡單的,但我沒有關於完成的Postgres 10年。

[經過研究] 的||運營商,我懷疑,是字符串連接,從http://www.sqlite.org/lang_expr.html

SQLite的功能是計算週日在指定日期前[安裝的SQLite和PostgreSQL後]:

sqlite> select date('now', '-'||strftime('%w','now')||' days'); 
2011-08-21 

mu is too short了拼圖的最後一塊:

postgres=# select date 'now' - extract(dow from timestamp 'now')::int; 
    ?column? 
------------ 
2011-08-21 
+0

是否有替代品,您可以建議? – locoboy

2

考慮使用to_char功能,例如 「3月12日18時07分22秒」 的格式,

PostgreSQL version:使用strftime功能(與awk幫助)

psql -c "SELECT to_char(time,'Mon DD HH24:MI:SS ') FROM mytable;" 

SQLite version

sqlite3 'SELECT strftime("%s", time, "localtime") FROM mytable;' \ 
    | awk '{print strftime("%b %e %H:%M:%S",$1) }' 


在現有例子中,

  • 印刷格式將年03月12 18點07分22秒
  • SQLite的柱時間是一個文本類型爲ISO8601字符串。
  • postgres列時間是type_time_stamp。