【问题标题】:Use SQL to Extract Month and Year from double in SQLite Database使用 SQL 从 SQLite 数据库中的 double 中提取月份和年份
【发布时间】:2017-10-22 18:00:17
【问题描述】:

我需要从GivingDate 中提取月份和年份作为整数。 GivingDate 是一个 C++ TDateTime 在 SQLite 数据库中存储为 double 用于正确排序。但是,strftime 需要将日期作为 string 参数。

这是 SQL 语句(不起作用):

SELECT 
  GivingDate, 
  Amount, 
  strftime('%y', datetime(GivingDate, 'unixepoch')) as GivingYear,
  strftime('%m', datetime(GivingDate, 'unixepoch')) as GivingMonth 
FROM 
  FSBC_GivingInfo;

如何修改 SQL 语句以从 SQLite 数据库中的 GivingDate 提取月份和年份为 GivingMonthGivingYear

【问题讨论】:

  • 什么是TDateTime?真的是自 1970 年以来的秒数吗?
  • TDateTime 是 Windows 系统时间。时间“0”是 1899 年 12 月 30 日上午 12:00。整数部分表示自 1899 年 12 月 30 日凌晨 12:00 以来的日期,小数部分表示 24 小时一天中的分数。

标签: sql sqlite strftime


【解决方案1】:

如果您将时间戳作为 TDateTime 存储在数据库中,则必须先对其进行转换。例如:

SQLite version 3.15.1 2016-11-04 12:08:49
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> create table x(timestamp real);
sqlite> insert into x values (2.75);
sqlite> insert into x values(35065);
sqlite> select * from x;
2.75
35065.0
sqlite> select strftime('%J', '1899-12-30'); -- base time as a Julian Day Number
2415018.5
sqlite> select datetime(timestamp+2415018.5) from x;
1900-01-01 18:00:00
1996-01-01 00:00:00
select cast(strftime('%m', timestamp+2415018.5) as integer), cast(strftime('%d', timestamp+2415018.5) as integer) from x;
1|1
1|1
sqlite>

但是,最好以https://sqlite.org/lang_datefunc.html 中列出的格式之一存储您的时间戳

(我建议使用 Julian Date 或 'YYYY-MM-DD HH:MM:SS' 格式 - 两者都会正确排序)

【讨论】:

    【解决方案2】:

    我不知道如何创建你的 sql 表,但是 sql 中的数据是日期时间格式的。你可以稍后编辑它: 首先将您的日期时间转换为 c++。然后在代码中进行编辑。

    DateTime myDateTime = "your  sql datetime";
    string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
    

    【讨论】:

    • "您可以稍后对其进行编辑:首先将您的日期时间转换为 c++,然后在代码中进行编辑。"这对我不起作用,因为我需要在后续 SQL 语句中使用“GROUP BY GivingYear”和“GROUP BY Giving Month”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多