【问题标题】:convert sqlite to postgres query将 sqlite 转换为 postgres 查询
【发布时间】:2011-08-25 17:54:05
【问题描述】:

有人可以帮我把这个 sqlite 查询转换成 postgres 查询吗?

SELECT count(*), count(*), date(date, '-'||strftime('%w',date)||' days') as date
FROM emails as m, contacts as me
WHERE datetime(date) > datetime('2010-08-25')
  and datetime(date) < datetime('2011-08-25')
  and (me.id = m.fr)
  and me.email like '%gmail.com%'
GROUP BY date
ORDER BY date asc

更新,我找到了答案:

select count(*), (m.date::date - extract(dow from m.date)::int) as dat
from emails as m join contacts as me on m.fr = me.id
where m.date > '2010-08-25'
  and m.date < '2011-08-25'
  and me.email like '%gmail.com%'
group by dat
order by dat

【问题讨论】:

  • 您在 potsgres 中使用什么类型的日期列?
  • 真的有两个count(*) 还是拼写错误?
  • 好像有两个count(*),也不知道为什么。日期类型是“带时区的时间戳”

标签: sql postgresql sqlite


【解决方案1】:

strftime 业务已处理elsewhere,因此我们只需在此处整理datetime(...) 的内容并补偿date 作为时间戳。当我在这里时,我将切换到显式连接条件(而不是 WHERE 子句中的隐式连接条件)。

select count(*), count(*), m.date::date - extract(dow from m.date)::int as date
from emails as m join contacts as me on m.fr = me.id
where m.date > '2010-08-25'
  and m.date < '2011-08-25'
  and me.email like '%gmail.com%'
group by m.date
order by m.date asc

PostgreSQL 可以自行将时间戳与 ISO8601 日期字符串进行比较,因此您无需进行任何转换或重新格式化即可进行比较。

这两个count(*) 对我来说仍然看起来有点滑稽,但我不知道使用查询的上下文,所以重复的可能有意义。

【讨论】:

  • 由于某种原因,这不是它。当您说 group by date 时,它并没有真正将其分组并将计数加在一起。
  • @cfarm54:您有任何示例数据和架构吗?我们有date 列、date 函数和date 别名; PostgreSQL 和 SQLite 可能会在不同的情况下做出不同的选择。
  • 确保emails 的架构是:(id integer primary key autoincrement, fr int references contacts(id), subj text, date datetime, mid text unique, reply text references msgs(mid), multipart bool); contacts 的架构是:(id INTEGER PRIMARY KEY AUTOINCREMENT, name text, email text not null); 。我也对“日期”一词感到困惑;在方法调用和变量之间,这非常令人困惑:P。
  • 我将表前缀添加到各种date 列使用中,看看这是否没有任何用处。 PostgreSQL timestamp 比 SQLite 的 datetime 具有更高的分辨率,这可能会导致一些分组奇怪;试试group by m.date::date 看看有什么作用。并且使用date 作为列名几乎是犯罪行为,您可能想与负责选择原始列名的人聊几句。
  • idk 如果这有帮助,但我认为查询试图做的是: 1. 将每天的日期修改为周末(星期日),然后按日期对每个计数进行分组.这样,您基本上可以计算 7 天内发送的电子邮件总数。
猜你喜欢
  • 2015-08-06
  • 2022-01-10
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 2013-04-17
相关资源
最近更新 更多