【问题标题】:problem while using database column value into Date() sqlite android在 Date() sqlite android 中使用数据库列值时出现问题
【发布时间】:2019-04-01 12:14:41
【问题描述】:


我有一个小问题,我用谷歌搜索了很多次,但我无法得到它...
我正在使用查询(sqlite)来检索一些数据..
在此查询中,它们是 Date() 用于增加某些日期的动态天数(来自同一表中的列)..
如果我把这天设为静态(1,2,3,.....)它工作正常,但如果我输入列名它不会。
此查询失败,我希望它工作:

String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE "
            + DATE + " = date('" + targetDate + "',' " + REPETITIONS + " day') ";

这很好用:

String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE "
            + DATE + " = date('" + targetDate + "','2 day') ";

在哪里

targetDate:用户输入的日期以获取该日期的事件

DATE:表中每个事件的日期

REPETETIONS:动态数(同表中的列)

问题是在日期函数中使用 REPETITIONS...

创建语句

String SQL_CREATE_EVENT_TABLE = "CREATE TABLE " + TABLE_NAME + " ( " +
            ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            TITLE + " TEXT ," +
            DATE + " TEXT , " +
            IS_NOTIFY + " INTEGER , " +
            NOTIFICATION_TIME + " TEXT ," +
            REPEAT + " INTEGER ," +
            REPEAT_DURATION + " INTEGER ," +
            REPETITIONS + " INTEGER ," +
            CERTAIN_DATE + " TEXT ," +
            NOTE + " TEXT ," +
            IS_SPOKEN + " INTEGER " +
            " );";

这是选择语句

String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE " + DATE + " = '" + targetDate
            + "' OR (( " + REPEAT + " = '1' AND " + REPEAT_DURATION + " = '0' ) AND " + DATE + " <= '" + targetDate + "')"
            + " OR( " + REPEAT + " = '1' AND " + REPEAT_DURATION + " = '3' ) AND " + DATE + " <= '" + targetDate + "' AND " + CERTAIN_DATE + " >= '" + targetDate + "'"
            + " OR (" + REPEAT + " = '1' AND " + REPEAT_DURATION + "= '2' ) AND " + targetDate + " >= '" + DATE + "' AND "+ targetDate+ " <= date('" + DATE + "','" + REPETITIONS + " days')";

【问题讨论】:

  • 能否请您显示有效的 SQL 语句和无效的 SQL 语句?
  • 这是有效的String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE " + DATE + " = date('" + targetDate + "',' 2 day') "; 但这不是。 String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE " + DATE + " = date('" + targetDate + "',' " + REPETITIONS + " day') ";@Corion
  • 请使用附加信息编辑您的问题。另外,这是一个有效的查询还是一个失败的查询?请同时显示一个失败的查询。
  • REPETITIONS 是您主程序中的变量吗?否则,您需要将连接放入 SQL 中。在发送到 SQLite 之前打印出你得到的 SQL。它应该看起来像 `SELECT ... WHERE date_column = date('2018-10-28', to_char(repetitions)+' day')" 或类似的东西。
  • 我展示了工作和失败......重复是全局字符串,它是@Corion 列的名称

标签: java android sqlite date android-sqlite


【解决方案1】:

此语句中的变量REPETITIONS

String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE "
            + DATE + " = date('" + targetDate + "',' " + REPETITIONS + " day') ";

应该是数字而不是列名。
SQLite 中的date 函数有多种语法,但你使用这个:

SELECT date('2014-10-23','+7 day');

您必须在day 之前提供一个数字。

编辑试试这个:

String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE "
            + DATE + " = date('" + targetDate + "', " + REPETITIONS + " || ' day') ";

【讨论】:

  • 但数字必须是动态的,独立于 db 中的(重复)列
  • 所以你必须使用一个整数变量来代替它。你到底想从数据库中选择什么?
  • 如何使用整型变量...列名不能是整型
  • 我正在制作日历应用程序......这个查询是获取事件的大查询的一部分......我想用它来获取重复事件(通过一些计算)现在没关系...现在重要的是在此方法中获取重复值
  • 您不能在日期函数中使用像列名这样的字符串。假设列的名称是“REPETITIONS”,那么您的语句将是:... date('2/1/2018',' REPETITIONS day') 这不是有效的 sql 语句
【解决方案2】:

在 sqlite date() function 中,NNN days 是字符串修饰符而不是表达式。因此,您不能在那里使用列名甚至|| 字符串连接。

您可以在代码中格式化修饰符字符串并将其放置在 SQL 中。这需要对数据库进行额外查询,这可能不是您想要的。

如果您可以假设每天是 24 小时(这并不总是正确的,例如 DST 事件),您可以尝试类似

... date(strftime('%s', '" + targetDate + "', " + REPETITIONS + "*24*60*60, 'unixepoch') ...

其中strftime('%s', ...) 转换为秒,date(..., 'unixepoch') 转换回日期戳。

但说真的,我会考虑重新设计架构以更好地支持您的功能需求。

【讨论】:

  • 我必须以这种方式设计我的架构...因为事件有多种重复类型.. 事件每天重复.. 事件每天重复直到特定日期.. 事件每天重复 x 次.. 。 .....等如果对第三种类型有任何想法?并感谢您的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2018-03-10
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多