sqlite - sqlite 中的 strftime 转换为 postgres

标签 sqlite postgresql

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

谁能帮我把这个 sqlite 段转换成 postgres?

最佳答案

这个 SQLite:

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

据我所知,从 date 中减去星期几(即 0 表示星期日,1 表示星期一,...),然后将结果转换回 日期;查看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 实际上是作为 double 值出现的,并且没有定义用于从 PostgreSQL 中的日期减去 double 值的运算符;转换也可以用标准形式编写为 cast(x as int)。当您从 PostgreSQL 中的日期中减去一个整数时,您减去了那么多天;您可以通过说 - interval '3 days' 之类的内容来更明确,但在这种情况下只会增加更多噪音,所以我选择了简单性。如果是星期二,那么我们的 PostgreSQL 版本如下所示:

d - 2

这与:

d - interval '2 days'

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

关于sqlite - sqlite 中的 strftime 转换为 postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7171561/

相关文章:

sql - Postgresql 在 json 数组中的数组中搜索

java - 如何从 sqlite 数据库中获取数据并将其存储在 ListView 中

iphone - 使用 C++ 和 sqlite 从 call_history.db 中提取一个表

ruby-on-rails - Heroku 部署问题.. 仍然

postgresql - Postgres : select the sum of values and then sum this again

sql - 在 Rails 中递归获取记录

ios - IO 中的 SQLite 只返回一行?

java - 无论如何,使用 rs.next() 加载 java 数组都会引发空指针错误。用控制台检查

postgresql - 如果两个进程同时修改两个事务中的数据,并且表存在唯一约束,会发生什么情况?

sql - 删除重复行(不要删除所有重复行)