我遇到了sqlite中的一个函数,我需要转换为postgres语法。它是date(date, '-'||strftime('%w',date)||' days')
。
任何人都可以帮我将这个sqlite段转换为postgres吗?
答案 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.html的SELECT 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) }'
在前面的例子中,