sqlite中的strftime转换为postgres

时间:2011-08-24 06:53:56

标签: sqlite postgresql

我遇到了sqlite中的一个函数,我需要转换为postgres语法。它是date(date, '-'||strftime('%w',date)||' days')

任何人都可以帮我将这个sqlite段转换为postgres吗?

3 个答案:

答案 0 :(得分:3)

这个SQLite:

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

是,AFAIK,从date减去星期几(即星期日为0,星期一为1,......),然后将结果转换回{{1} };有关详细信息,请参阅date function reference

我认为PostgreSQL的等价物是:

date

其中d - extract(dow from d)::int 是您的约会对象;从日期中减去一个整数会减去该天数。如果d是时间戳,那么您可能需要添加一些转换。还有date_trunc('week', 'd'),但是从星期一开始计算这些天数,所以你会被一个人带走。


以下是SQLite的快速细分,d变量替换为date,以避免与d函数混淆:

date()

首先,date(d, '-' || strftime('%w', d) || ' days') 是标准的SQL字符串连接运算符。 strftime function是来自POSIX的通用日期和时间格式化程序; ||格式说明符的意思是“星期几为星期日为零的数字”;所以%w电话给你0星期日,1星期一,等星期六星期六。如果strftime是星期二,则d调用将产生2,整个事情最终结束为:

strftime

SQLite date function的修饰符有各种形式,但date(d, '-2 days') 表示您的想法:从'-2 days'减去两天。总体结果是,您将d截断为一周(其中星期日被视为一周的第一天)。

在PostgreSQL方面:

d

我们可以从extract开始; d - extract(dow from d)::int 用于提取日期或时间的特定部分,extract表示“星期几为星期日为零的数字”。听起来有点熟?然后dow将DOW编号转换为整数并且是必需的,因为DOW实际上是双精度值,并且没有运算符定义为从PostgreSQL中的日期减去double;演员表也可以用::int的标准格式书写。当你从PostgreSQL中的一个日期中减去一个整数时,你会减去那么多天;你可以通过说cast(x as int)这样的事情来更明确,但在这种情况下会增加更多的噪音,所以我选择了简单。如果它是星期二,那么我们的PostgreSQL版本看起来像:

- interval '3 days'

,这与:

相同
d - 2

减法后,我们将在周日回来。 PostgreSQL中还有date_trunc,但这会截断到星期一而不是星期天。

答案 1 :(得分:2)

%w是星期几为0的星期几,与Postgresql的DOW相同:来自http://www.postgresql.org/docs/current/static/functions-datetime.htmlSELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');

字符串操作应该非常简单,但我还没有完成Postgres大约10年。

[经过更多研究] 我怀疑||运算符是来自http://www.sqlite.org/lang_expr.html

的字符串连接

[安装sqlite和postgresql之后] sqlite函数正在计算给定日期之前的星期日:

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

答案 2 :(得分:2)

给定的格式如“ Mar 12 18:07:22 ”,

PostgreSQL version使用to_char函数:

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

SQLite version使用strftime函数(在awk的帮助下):

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


在前面的例子中,

  • 打印格式为 3月12日18:07:22
  • sqlite列 时间 是TEXT类型,为ISO8601字符串。
  • postgres列 时间 的类型为time_stamp。