为什么当我执行代码时它会返回表的所有日期
代码
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日,其中是“随机日期”,即日期日期不应采用该格式,日期应(使用最可能合适的格式)
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/