是“-1月”吗?在 SQLite DATETIME 函数中“损坏”?

发布于 2024-10-28 04:58:27 字数 603 浏览 1 评论 0原文

当使用 DATETIME 函数进行一些算术运算时,我发现了以下行为:

select DATETIME('now', '-1month', 'start ofmonth')
预计时间:2011-02-01 00:00:0
结果:2011-03-01 00:00:0 -

选择 DATETIME('now', '-2 月', '月初') 失败
预计时间:2011-01-01 00:00:0
结果:2011-01-01 00:00:0 - 好的,

这似乎只从昨天开始发生,我的集成测试发现了这一点。我的猜测是,减去的月份是以天为单位计算的,并且以某种方式使用了上一个完整月份的天数(而不是当前的天数)。最后一个完整的月份,2 月有 28 天,因此结果)

通过更改 DATETIME 函数的输入顺序可以轻松解决这个问题,如下所示:DATETIME('now', 'start of Month', '-1 Month') ,但这仍然是一种棘手的行为,并且可能会导致被忽视的错误。

我正在使用 System.Data.SQLite.DLL / 版本 1.0.66.0 / 2010 年 4 月 18 日

还有其他人发现此行为吗?这是一个(已知)错误吗?还是我“做错了”?

When using the DATETIME function to do some arithmetic, I've found the following behaviour:

select DATETIME('now', '-1 month', 'start of month')
expected: 2011-02-01 00:00:0
result: 2011-03-01 00:00:0 - Fail

select DATETIME('now', '-2 month', 'start of month')
expected: 2011-01-01 00:00:0
result: 2011-01-01 00:00:0 - Ok

This only appears to be happening since yesterday, my integration tests picked up on this. My guess is that the month that is substracted is calculated in days and that somehow the number of days in the last full month is used (not the current). The last full month, february featured 28 days, hence the result)

This is easily resolved by changing the order of input to the DATETIME function, like so: DATETIME('now', 'start of month', '-1 month'), but still it is tricky behaviour and likely to result in bugs that get unnoticed.

I am using System.Data.SQLite.DLL / version 1.0.66.0 / Apr 18, 2010

Anybody else found this behaviour? Is this a (known) bug? Or am I 'doing it wrong'?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

-残月青衣踏尘吟 2024-11-04 04:58:27

现在 减去一个月 = 2 月 30 日 = 3 月 2 日。然后 start of Month 为您提供三月的开始时间。这可能不是任何人想要的行为,但它是文档所描述的:转到 http://www.sqlite.org/lang_datefunc.html。 sqlite.org/lang_datefunc.html 并搜索“通过渲染工作”。

now minus one month = 30th of February = 2nd of March. Then start of month gives you the start of March. This is probably not the behaviour anyone ever wants, but it's what the documentation describes: go to http://www.sqlite.org/lang_datefunc.html and search for "works by rendering".

倾听心声的旋律 2024-11-04 04:58:27

而不是:

SELECT datetime('now','-1 month','start of month');

你尝试过吗:

SELECT datetime('now','start of month','-1 month');

我认为第二个总是会给你上个月的第一天。如果当前月份的天数多于上个月,前者有时会给出当前月份的第一天。

Instead of:

SELECT datetime('now','-1 month','start of month');

Have you tried:

SELECT datetime('now','start of month','-1 month');

I think the second will always give you the first day of the previous month. The former will sometimes give you the first day of the current month if there are more days in the current month than in the previous month.

ヤ经典坏疍 2024-11-04 04:58:27

我很确定这是有效的如文档所述

请注意,“±NNN 月”的工作原理是将原始日期渲染为
YYYY-MM-DD 格式,添加 ±NNN
MM 月份值,然后标准化
结果。因此,例如,
数据 2001-03-31 修改为“+1 个月”
最初产量 2001-04-31,但 4 月
只有 30 天,所以日期是
标准化为 2001-05-01。

我预计正常化之前的变化是 2 月 30 日,这不是一个有效的日期。

I'm pretty sure that's working as documented.

Note that "±NNN months" works by rendering the original date into the
YYYY-MM-DD format, adding the ±NNN to
the MM month value, then normalizing
the result. Thus, for example, the
data 2001-03-31 modified by '+1 month'
initially yields 2001-04-31, but April
only has 30 days so the date is
normalized to 2001-05-01.

I'd expect the change before normalizing to be Feb 30, which isn't a valid date.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文