postgresql strftime in sqlite convert to postgres

zour9fqk  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(3)|浏览(105)

我在sqlite中遇到了一个函数,我需要将其转换为postgres语法。是date(date, '-'||strftime('%w',date)||' days')
谁能帮我把这个sqlite段转换成postgres?

vc6uscn9

vc6uscn91#

此SQLite:

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

是,AFAIK,减去一周中的天数(即0表示星期日,1表示星期一,...),然后将结果转换回date;详情请参阅date function reference
我认为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 function是来自POSIX的通用日期和时间格式化程序; %w说明符意味着“星期几是一个数字,星期日是第零天”;因此,strftime调用在周日为您提供0,在周一为您提供1,依此类推,直到在周六为您提供6。如果d是星期二,那么strftime调用将产生2,整个事情结束为:

date(d, '-2 days')

SQLite date function的修饰符有多种形式,但'-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,但它会截断到星期一而不是星期天。

olqngx59

olqngx592#

给定日期时间格式,如“Mar 12 18:07:22

psql使用to_char

PostgreSQL客户端使用to_char函数:

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

在本例中,postgres列__time__的类型为time_stamp

sqlite3连接到awk

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

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

打印格式为 Mar 12 18:07:22。sqlite列__time__是一个TEXT类型的ISO8601字符串。

gab6jxml

gab6jxml3#

%w是星期几,从Sunday=0开始的数字,与Postgresql的DOW相同:SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');来自http://www.postgresql.org/docs/current/static/functions-datetime.html
字符串操作应该很简单,但我已经有10年没有使用Postgres了。
[经过进一步研究] ||运算符,正如我所怀疑的,是字符串连接,来自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

相关问题