[英]strftime in sqlite convert to postgres
我在sqlite中遇到了一個需要轉換為postgres語法的函數。 它是date(date, '-'||strftime('%w',date)||' days')
。
誰能幫我把這個sqlite段轉換成postgres?
這個SQLite:
date(date, '-' || strftime('%w', date) || ' days')
是,據我所知,減去一天在星期幾的天數(即0代表星期日,1代表星期一,...)的date
,然后將結果轉換回一個date
; 有關詳細信息,請參見日期函數參考 。
我認為PostgreSQL的等效項是:
d - extract(dow from d)::int
d
是您的日期; 從日期減去整數將減去該天數。 如果d
是時間戳記,則可能需要添加一些轉換。 也有date_trunc('week', 'd')
,但是它開始從星期一開始對天進行編號,因此您會因此而離開。
這是SQLite的快速分解,其中date
變量替換為d
以避免與date()
函數混淆:
date(d, '-' || strftime('%w', d) || ' days')
首先, ||
是標准的SQL字符串串聯運算符。 strftime
函數是POSIX的通用日期和時間格式化程序; %w
格式說明符的意思是“星期幾為數字,星期天為零”; 因此strftime
呼叫會給您0(星期日),1(星期一),依此類推,直到星期六(6)。 如果d
是星期二,則strftime
調用將產生2,並且整個運算結束為:
date(d, '-2 days')
SQLite date
函數的修飾符具有多種形式,但是'-2 days'
意味着您所想的:從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
,但是它將截斷到星期一而不是星期天。
假設格式為“ 3月12日18:07:22 ”,
PostgreSQL版本使用to_char
函數:
psql -c "SELECT to_char(time,'Mon DD HH24:MI:SS ') FROM mytable;"
使用strftime
函數的SQLite版本 (在awk
的幫助下):
sqlite3 'SELECT strftime("%s", time, "localtime") FROM mytable;' \
| awk '{print strftime("%b %e %H:%M:%S",$1) }'
在前面的示例中,
%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了。
[詳細研究之后] ||
我懷疑,運算符是字符串連接,來自http://www.sqlite.org/lang_expr.html
[在安裝sqlite和postgresql之后] sqlite函數正在計算給定日期之前的星期日:
sqlite> select date('now', '-'||strftime('%w','now')||' days');
2011-08-21
畝太短給了最后一個難題:
postgres=# select date 'now' - extract(dow from timestamp 'now')::int;
?column?
------------
2011-08-21
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.