android - SQLite中的日期不起作用

标签 android sqlite date android-studio android-sqlite

为什么当我执行代码时它会返回表的所有日期
代码

    Strign raw[] = {"id","date"}
    String args[] ={"2017-6-24"} 
    Cursor cursor = database.query("database1", raw , date + "<=?"
                        , args, null, null, null);

我试过但没有成功的事情:
1)我试图在代码中输入“日期(示例日期)”。
    Strign raw[] = {"id","date"}
    String args[] ={"date(2017-6-24)"} 
    Cursor cursor = database.query("database1", raw , "date("+date + ")<=?"
                        , args, null, null, null);

2)
    Strign raw[] = {"id","date"}
    String args[] ={"2017-6-24"} 
    Cursor cursor = database.rawQuery("SELECT * FROM database1 "+ 
                                       "WHERE date<="+"2017-6-24",null);

编辑
在我的应用程序中,我需要返回一个特定日期之前的所有日期,即如果我的日期表中有此日期
     | ID |   DATE   |
     -----------------
     |  1 | 2018-6-21|
     |  2 | 2015-5-12|
     |  3 | 2013-3-17|
     |  4 | 2017-2-13|

我在我的应用程序中输入日期'2017-6-24'我需要返回它之前的所有日期,即我需要得到
     | ID |   DATE   |
     -----------------
     |  2 | 2015-5-12|
     |  3 | 2013-3-17|
     |  4 | 2017-2-13|

但是当我试着去做的时候我得到了桌子上所有的日期

最佳答案

当您使用原件时,您实际上是在发出查询:

SELECT * FROM database1 WHERE date(date)<='random date';

即,它将返回日期(例如字符串2018-01-01)小于或等于字符串随机日期的所有行。因此,当r大于2(或任何数字作为字符)时,它将返回所有行。
更具体地说:
random不是返回随机数的函数,random date也不是
尝试1将有效地发出查询:
SELECT id,date FROM database1 WHERE date(date)<='date(random date)';

即,如上所述,但第一个字符将是d
尝试2将有效地发出查询:
SELECT * FROM database1 WHERE date<=random date;

它将失败,出现语法错误,如near "date": syntax error
更具体地说:
random不是返回随机数的函数,random date也不返回随机数。random()是sqlite的核心函数之一,可用于返回随机的64位有符号整数。
通过rawQuery的第二个参数传递或作为query的第四个参数传递的任何参数都将导致值被括为字符串,因此不能将sqlite函数作为参数传递,因为它们将被括为视为字符串。
看来你想要的东西是基于:
SELECT * FROM database1 WHERE date<=date(random());

注意,上面的假设不是Strign,而是将String用作原始变量的类型。
不是说上面的方法行得通。简而言之(即,必须使用datetime()并使用“uniepoch”来使用整数和其他一些操作),这将导致从1970年到今天出生的人的一生很久以前的大量日期。您可能希望在一个相对较短的定义期间内获得返回的任何行。
因此,假设您希望基于当前日期后一年内的某个日期随机设置一组行,那么您可以:
SELECT * FROM database1 WHERE  date <= date('now','+'||(ABS(random())%365)||' DAYS');

这是为了:
生成一个随机数,它有一个很大的范围,负值和正值,然后
使用ABS(n)函数返回正值。
将该数字除以365(相当于1年的天数)后返回模数(余数)。
将该天数添加到当前日期,以在一年内指定一个日期作为where子句的正确参数。
可使用:
String raw[] = {"id","date"}
Cursor cursor = database.query("database1", raw , date <= date('now','+'||(ABS(random())%365)||' DAYS')
                    , null, null, null, null);

注意,这不一定是你想要的,你并没有明确你的要求。相反,它是一个示例,说明如何获取一个可能合适也可能不合适的随机日期(例如,您可能需要一年前的日期,在这种情况下,可以将+更改为-)。
编辑1
Re:
注:当我说“随机日期”时,我指的是我放在里面的任何日期
括号不在函数“random()”中,例如
2018年6月8日,其中是“随机日期”,即日期<=(2018年6月8日)
日期不应采用该格式,日期应(使用最可能合适的格式)yyyy-mm-dd例如2018-06-08(同样,它们也应这样存储在数据库中)。
根据
SQL As Understood By SQLite - Date And Time Functions -Time Strings
使用SELECT * FROM database1 WHERE date <=(8-6-2018);实际上是在说SELECT * FROM database WHERE date <= -2016(即2018年减少8个或6个,相当于2018年减少2个)。
你会遇到很多问题,就是你不改变一个公认的格式。这并非不可能,但使用8-6-2018(以及格式的排列,即8-6-2018(8个字符)、10-6-2018(现在是9个字符)和10-10-2018(10个字符))将需要复杂的转换为可用格式。
例如,你必须使用这样的东西:
WITH 

 selection_date(sdate) AS ( SELECT '8-6-2018'), --<<<<<<<< selection value

 converted_selection_date(sdate,converted_selection) AS (
        SELECT DISTINCT
            sdate,
            CASE
            WHEN length(sdate) = 8 THEN
                substr(sdate,5,4)||'-0'||substr(sdate,3,1)||'-0'||substr(sdate,1,1)
            WHEN (length(sdate) = 9 AND substr(sdate,2,1) = '-') THEN -- d-mm-yyyy
                substr(sdate,6,4)||'-'||substr(sdate,3,2)|'-0'||substr(sdate,1,1)
            WHEN (length(sdate) = 9 AND substr(sdate,3,1) = '-') THEN -- dd-m-yyyy
                substr(sdate,6,4)||'-0'||substr(sdate,4,1)||'-'||substr(sdate,1,2)
            WHEN (length(sdate) = 10 AND substr(sdate,3,1) = '-') THEN -- dd-mm-yyyy
                substr(sdate,7,4)||'-'||substr(sdate,4,2)||'-'||substr(sdate,1,2)
            ELSE sdate||'----'||length(sdate)
        END AS converted_selection
        FROM selection_date
    ),

 converted_date_column(rid,converted_date) AS (
    SELECT rowid AS rid, 
        CASE 
            WHEN (length(date) = 8 AND substr(date,2,1) = '-') THEN -- d-m-yyyy 
                substr(date,5,4)||'-0'||substr(date,3,1)||'-0'||substr(date,1,1)
            WHEN (length(date) = 9 AND substr(date,2,1) = '-') THEN -- d-mm-yyyy
                substr(date,6,4)||'-'||substr(date,3,2)|'-0'||substr(date,1,1)
            WHEN (length(date) = 9 AND substr(date,3,1) = '-') THEN -- dd-m-yyyy
                substr(date,6,4)||'-0'||substr(date,4,1)||'-'||substr(date,1,2)
            WHEN (length(date) = 10 AND substr(date,3,1) = '-') THEN -- dd-mm-yyyy
                substr(date,7,4)||'-'||substr(date,4,2)||'-'||substr(date,1,2)
            ELSE date
            END AS converted_date
    FROM argent
    )
    SELECT date FROM argent, converted_selection_date WHERE date <= converted_selection
;

编辑2
Re:
最简单的解决方案是始终使用10个字符的格式,即yyyy-mm-dd,而不是8-10个字符的格式,例如。
使用2017-06-24或2017-06-01代替2017-6-24或2017-06-1。(即领先0个月,少于10天)
在这种情况下,原件和2)将按原样工作。
1)工作可以是:
String raw[] = {"id","date"}
String args[] ={"random date"} 
Cursor cursor = database.query("database1", raw , "date(date)<=date(?)"
                    , args, null, null, null);

也就是说,只有值本身是参数where子句的其余部分是硬编码的,因此没有被引用。
虽然比上面的示例转换更简单,但是如果格式保持为8-10,那么您仍然需要像上面那样进行一些转换,以免得到不需要的结果。
例如,如果选择日期是2017-2-1,那么2017-10-1将显示为较少使用原始版本和2(1将不起作用)。因为字符串2017-1….小于字符串2017-2….

关于android - SQLite中的日期不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51181796/

相关文章:

android - 以编程方式更改图层列表项目的顶部/右侧/底部/左侧

android - 为 BlackBerry 重新打包 .apk - 签名和发布

iphone - 在 Apple 和 Android 上购买实物商品和服务的可能性

java - 如何使用for循环插入多个值

mysql - 在 Mysql 的日期类型中存储非公历日期

android - Android 中从左到右的无缝 Activity 过渡动画

sql - Full Outer Join - 在新表中保存输出

java - 日期构造函数java

java - 如何自动将编译日期添加到java项目中

sqlite - SQLite:如何使用alter将主键添加到表?