【问题标题】:SQLite strftime() weekdaySQLite strftime() 工作日
【发布时间】:2016-08-29 02:16:49
【问题描述】:

我一直在尝试计算在特定工作日创建了多少值,但没有成功:

SELECT count(*) as count FROM packets WHERE strftime("%w", timeIn) = '1';

我在 timeIn 中有这个值

1472434822.60033
1472434829.12632
1472434962.34593

我不知道我在这里做错了什么。

此外,如果我使用这个:

SELECT count(*) as count FROM packets WHERE strftime("%w", timeIn) = '6';

我明白了

2

这毫无意义。先感谢您。

【问题讨论】:

    标签: sqlite weekday


    【解决方案1】:

    您似乎将日期存储为自 1970 年(Unix 纪元)以来的秒数 - 一种常见的表示形式。 SQLite date functions 接受的时间字符串(参见 时间字符串 部分)默认将数字时间字符串解释为儒略日数:

    同样,格式 12 以 10 位有效数字显示,但日期/时间函数将真正接受表示儒略日数所需的尽可能多或尽可能少的数字。

    您可以通过以下SELECT 看到这一点:

    SELECT strftime('%Y-%m-%d', 1472428800.6) AS t
    

    结果是:

    4026-48-26
    

    要将您的日期表示解释为 Unix 纪元,您需要在 strftime 调用中包含 'unixepoch'

    SELECT strftime('%Y-%m-%d', 1472428800.6, 'unixepoch') AS t
    

    返回:

    2016-08-29
    

    如果您将SELECT 修改为:

    SELECT count(*) as count FROM packets WHERE strftime("%w", timeIn, 'unixepoch') = '6'
    

    您应该会看到更符合您期望的结果。

    【讨论】:

    • 谢谢。我试过了,但没有得到任何回报:SELECT count(*) as count FROM packets WHERE strftime("%w", timeIn, 'unixepoch') = 1; 是否应该改为更改数据库的格式更好?
    • 您可以尝试一些SELECT 语句,以确保转换符合您的预期。例如,使用问题中的第一个值:SELECT strftime('%w', 1472434822.60033, 'unixepoch') AS w, date(1472434822.60033, 'unixepoch') AS d 返回12016-08-29
    • 再次感谢您的友好回复。我分别得到12016-08-29。不过奇怪的是,SELECT count(*) as count FROM packets WHERE strftime("%w", timeIn, 'unixepoch') = '0' 正在返回 3。星期一应该是一个人?
    • 如果您仍然有问题,我建议使用sqlite3 命令行(或 SqliteSpy 等 GUI 工具)对您的数据运行一些 SELECT 命令 - 以确保它是什么你认为是的。关于使用不同的日期格式,没有什么意义,但是如果您有大量数据,您可能希望包含一个具有预先计算的星期几的列(使用strftime 计算它在INSERT) 上,以便在查询时不必将strftime 应用于每一行。
    • 来自documentation:“%w”是“星期天==0的第0-6周”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多