sqlite中的# strftime转换为postgres
问题:sqlite中的# strftime转换为postgres 我在 sqlite 中遇到了一个需要转换为 postgres 语法的函数。是date(date, '-'||strftime('%w',date)||' days')。 谁能帮我把这个 sqlite 段转换为 postgres? 解答 这个 SQLite: date(date, '-' || strftime('%w', date)
问题: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
但这会截断到星期一而不是星期日。
更多推荐
所有评论(0)