簡體   English   中英

sqlite中的strftime轉換為postgres

[英]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) }' 


在前面的示例中,

  • 印刷格式為3月12日18:07:22
  • sqlite列時間是ISO8601字符串的TEXT類型。
  • postgres列的時間為time_stamp。

%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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM