我在sqlite中遇到了一个函数,我需要将其转换为postgres语法。是date(date, '-'||strftime('%w',date)||' days')谁能帮我把这个sqlite段转换成postgres?
date(date, '-'||strftime('%w',date)||' days')
vc6uscn91#
此SQLite:
date(date, '-' || strftime('%w', date) || ' days')
是,AFAIK,减去一周中的天数(即0表示星期日,1表示星期一,...),然后将结果转换回date;详情请参阅date function reference。我认为PostgreSQL的等价物是:
date
d - extract(dow from d)::int
其中d是您的日期;从日期中减去一个整数就是减去该天数。如果d是一个时间戳,那么您可能需要添加一些类型转换。也有date_trunc('week', 'd'),但它从星期一开始编号,所以你会用它来计数。下面是SQLite的快速分解,其中date变量被d替换,以避免与date()函数混淆:
d
date_trunc('week', 'd')
date()
date(d, '-' || strftime('%w', d) || ' days')
首先,||是标准的SQL字符串连接运算符。strftime function是来自POSIX的通用日期和时间格式化程序; %w说明符意味着“星期几是一个数字,星期日是第零天”;因此,strftime调用在周日为您提供0,在周一为您提供1,依此类推,直到在周六为您提供6。如果d是星期二,那么strftime调用将产生2,整个事情结束为:
||
strftime
%w
date(d, '-2 days')
SQLite date function的修饰符有多种形式,但'-2 days'的意思与您所想的一样:从d中减去两天。总的结果是d被截短为周(其中星期日被认为是一周的第一天)。在PostgreSQL方面:
'-2 days'
我们可以从extract开始; extract用于提取日期或时间的特定部分,dow表示“星期几作为一个数字,星期日是第零天”。听起来耳熟吗然后::int将DOW数字转换为整数,这是需要的,因为DOW实际上是一个双精度值,并且在PostgreSQL中没有定义从日期中减去双精度值的运算符;转换也可以以标准形式写成cast(x as int)。在PostgreSQL中,当你从一个日期中减去一个整数时,你减去了那么多天;你可以更明确地说,像- interval '3 days',但这只会增加更多的噪音在这种情况下,所以我选择了简单。如果是星期二,那么我们的PostgreSQL版本看起来像:
extract
dow
::int
cast(x as int)
- interval '3 days'
d - 2
也就是说
d - interval '2 days'
减去之后我们星期天回来。在PostgreSQL中也有date_trunc,但它会截断到星期一而不是星期天。
date_trunc
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。
__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字符串。
TEXT
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函数计算给定日期之前的星期日:
SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
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
3条答案
按热度按时间vc6uscn91#
此SQLite:
是,AFAIK,减去一周中的天数(即0表示星期日,1表示星期一,...),然后将结果转换回
date
;详情请参阅date function reference。我认为PostgreSQL的等价物是:
其中
d
是您的日期;从日期中减去一个整数就是减去该天数。如果d
是一个时间戳,那么您可能需要添加一些类型转换。也有date_trunc('week', 'd')
,但它从星期一开始编号,所以你会用它来计数。下面是SQLite的快速分解,其中
date
变量被d
替换,以避免与date()
函数混淆:首先,
||
是标准的SQL字符串连接运算符。strftime
function是来自POSIX的通用日期和时间格式化程序;%w
说明符意味着“星期几是一个数字,星期日是第零天”;因此,strftime
调用在周日为您提供0,在周一为您提供1,依此类推,直到在周六为您提供6。如果d
是星期二,那么strftime
调用将产生2,整个事情结束为:SQLite
date
function的修饰符有多种形式,但'-2 days'
的意思与您所想的一样:从d
中减去两天。总的结果是d
被截短为周(其中星期日被认为是一周的第一天)。在PostgreSQL方面:
我们可以从
extract
开始;extract
用于提取日期或时间的特定部分,dow
表示“星期几作为一个数字,星期日是第零天”。听起来耳熟吗然后::int
将DOW数字转换为整数,这是需要的,因为DOW实际上是一个双精度值,并且在PostgreSQL中没有定义从日期中减去双精度值的运算符;转换也可以以标准形式写成cast(x as int)
。在PostgreSQL中,当你从一个日期中减去一个整数时,你减去了那么多天;你可以更明确地说,像- interval '3 days'
,但这只会增加更多的噪音在这种情况下,所以我选择了简单。如果是星期二,那么我们的PostgreSQL版本看起来像:也就是说
减去之后我们星期天回来。在PostgreSQL中也有
date_trunc
,但它会截断到星期一而不是星期天。olqngx592#
给定日期时间格式,如“Mar 12 18:07:22”
psql
使用to_char
PostgreSQL客户端使用
to_char
函数:在本例中,postgres列
__time__
的类型为time_stamp
。sqlite3
连接到awk
。SQLite在
awk
的帮助下使用strftime
函数:打印格式为 Mar 12 18:07:22。sqlite列
__time__
是一个TEXT
类型的ISO8601字符串。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函数计算给定日期之前的星期日:
mu is too short给出了最后一块拼图: