【问题标题】:C# Finisar SQLite DateTime Comparison ProblemC# Finisar SQLite 日期时间比较问题
【发布时间】:2010-06-03 17:48:58
【问题描述】:

我的“任务”数据库表如下所示:

[title] [content] [start_date] [end_date]
[...] [...] [01.06.2010 20:10:36] [06.06.2010 20:10:36]
[...] [...] [05.06.2010 20:10:36] [06.06.2010 20:10:36]

我只想找到满足给定日期在 start_date 和 end_date 之间的条件的记录。

我尝试了以下 SQL 表达式:

SELECT * FROM task WHERE
strftime ('%d', start_date) <= @day
AND
@day <= strftime ('%d', end_date)

@day 是一个 SQLiteParameter (eq 5)。但是没有返回任何结果。

我该如何解决这个问题?

谢谢。

【问题讨论】:

    标签: c# sql datetime sqlite strftime


    【解决方案1】:
    SELECT *
    FROM task
    WHERE @day BETWEEN date(start_date) and date(end_date)
    

    【讨论】:

      【解决方案2】:

      似乎在 SQLite3 中处理数据和时间的函数不接受像参数表列一样。只期望字符串。但是,您可以使用字符串来比较数据。

      例子:

      SELECT * FROM table WHERE
      table_column> = "06.25.2010 00:00:00"
      AND
      table_column <"06.25.2010 23:59:59"
      

      这对我有用。

      【讨论】:

      • 感谢 Emanuel 工作正常,但您在这里犯的唯一错误是格式在两种情况下必须相同,即它必须是 mm.dd.yyyy。我会改正的。
      【解决方案3】:

      您的列名不应使用单引号,因为这会创建字符串。相反,您可以使用双引号,或者在这种情况下您根本不需要引号。试试这个:

      SELECT *
      FROM task
      WHERE strftime('%d', start_date) <= @day
      AND @day <= strftime('%d', end_date)
      

      或者你的意思是这样的:

      SELECT *
      FROM task
      WHERE date(start_date) <= @day
      AND @day <= date(end_date)
      

      【讨论】:

        【解决方案4】:

        等等,误解了您的预期查询。这应该有效:

        SELECT * FROM task WHERE
        strftime ('%d', start_date) <= @day
        AND
        @day <= strftime ('%d', end_date)
        

        提供的@day 实际上是一个 2 位数的文本类型。要使其与数字类型一起使用,请使用:

        SELECT * FROM task WHERE
        CAST(strftime('%d', start_date) as integer) <= @day
        AND
        @day <= CAST(strftime('%d', end_date) as integer)
        

        【讨论】:

        • @Emanuel:Visual Studio 查询设计器会抱怨它无法识别 AS 关键字,但该查询确实为我运行。
        猜你喜欢
        • 2021-08-17
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        相关资源
        最近更新 更多