问题:sqlite中的# strftime转换为postgres

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

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

解答

这个 SQLite:

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

是,AFAIK,从date中减去星期几(即 0 代表星期日,1 代表星期一,...),然后将结果转换回date;详见日期函数参考。

我认为 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函数是来自POSIX的通用日期和时间格式化程序;%w格式说明符表示“星期几作为数字,星期日为零天”;所以strftime调用给你 0 代表星期日,1 代表星期一,以此类推,直到星期六 6。如果d是星期二,那么strftime调用将产生 2 并且整个事情结束为:

date(d, '-2 days')

SQLitedate函数的修饰符有多种形式,但'-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但这会截断到星期一而不是星期日。

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐