sqlite中的strftime转换为postgres
我在sqlite中遇到了一个需要转换为postgres语法的函数。它是sqlite中的strftime转换为postgres,sqlite,postgresql,Sqlite,Postgresql,我在sqlite中遇到了一个需要转换为postgres语法的函数。它是date(date,'-'| | strftime('%w',date)| | days') 有人能帮我把这个sqlite段转换成postgres吗?%w是一周中的某一天,从星期日开始的数字=0,与Postgresql的DOW相同:SELECT EXTRACT(DOW from TIMESTAMP'2001-02-16 20:38:40')来自 字符串操作应该很简单,但我已经有10年没有做过Postgres了 [经过进一步研究
date(date,'-'| | strftime('%w',date)| | days')
有人能帮我把这个sqlite段转换成postgres吗?%w是一周中的某一天,从星期日开始的数字=0,与Postgresql的DOW相同:
SELECT EXTRACT(DOW from TIMESTAMP'2001-02-16 20:38:40')代码>来自
字符串操作应该很简单,但我已经有10年没有做过Postgres了
[经过进一步研究]
正如我所怀疑的,|
操作符是字符串连接,来自
[安装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
此SQLite:
date(date, '-' || strftime('%w', date) || ' days')
是指,AFAIK,从日期中减去周数天数中的一天(即,0表示星期天,1表示星期一,…),然后将结果转换回日期
;有关详细信息,请参阅
我认为PostgreSQL的等价物是:
d - extract(dow from d)::int
其中d
是您的日期;从一个日期减去一个整数就会减去天数。如果d
是一个时间戳,那么您可能需要添加一些强制转换。也有,但从周一开始计算天数,这样你就可以一天一天的休息了
下面是SQLite的快速分解,其中date
变量替换为d
,以避免与date()
函数混淆:
date(d, '-' || strftime('%w', d) || ' days')
psql -c "SELECT to_char(time,'Mon DD HH24:MI:SS ') FROM mytable;"
首先,|
是标准的SQL字符串连接运算符。是来自的通用日期和时间格式化程序;%w
格式说明符表示“星期几作为数字,星期日为零”;因此,strftime
调用为星期天提供0,为星期一提供1,依此类推,为星期六提供6。如果d
是一个星期二,那么strftime
调用将产生2,整个结果如下:
date(d, '-2 days')
SQLite的修饰符有多种形式,但是“-2天”
的意思正是您所想的:从d
中减去两天。总体结果是d
被截断为一周(其中周日被视为一周的第一天)
在PostgreSQL方面:
d - extract(dow from d)::int
我们可以从extract
用于提取日期或时间的特定部分,dow
表示“一周中的某一天为数字,周日为零日”。听起来熟悉吗?然后,::int
将道琼斯指数转换为整数,这是必需的,因为道琼斯指数实际上是一个双精度值,并且在PostgreSQL中没有定义用于从日期中减去双精度值的运算符;强制转换也可以标准格式编写为cast(x为int)
。当你在PostgreSQL中从一个日期中减去一个整数时,你减去了那么多天;你可以通过说-interval'3days'
这样的话来更明确一些,但在这种情况下,这只会增加更多的噪音,所以我选择了简单。如果是星期二,那么我们的PostgreSQL版本如下所示:
d - 2
这与:
d - interval '2 days'
减法之后,我们将在周日回来。PostgreSQL中也有,但会截短到星期一而不是星期天。给定类似“Mar 12 18:07:22”的格式,
使用到\u char
功能:
date(d, '-' || strftime('%w', d) || ' days')
psql -c "SELECT to_char(time,'Mon DD HH24:MI:SS ') FROM mytable;"
使用strftime
功能(借助awk
):
在前面的示例中
- 打印格式为3月12日18:07:22
- sqlite列time是一种文本类型,为ISO8601字符串
- postgres列时间为时间戳类型
您能推荐一个替代方案吗?您能让我先了解sqlite语句的逻辑,然后再了解postgres的逻辑吗?我很难跟上参考资料。@cfarm54:我为您添加了一些演练。