我在Android SQLite数据库中有一个包含以下字段的表。
在这里,due_date列是整数,我只想要在due_date 中单独匹配今天的日期(当前日期)的记录,而不考虑时间。
例如:如果有3个与当前日期匹配的值,则需要来返回所有3行
注意:在我的例子中,必须与当前日期进行比较,而不是使用当前时间戳,但我的列类型是具有unix-epoch值的整数。我的unix时代的例子是"1526565900000".。
我试过:
date('now', 'start of day') // not working
date('now','localtime','start of day') // not working
select strftime('%d', date('now')), name, due_date from task group by due_date;
这也不符合我的要求。
最后,如下面的注释所示,将所有的日期时间和时间戳列更改为整数,以存储为unix时代的值,在此之前,我的所有列都是时间戳。
发布于 2018-05-24 15:58:45
步骤1:首先将列类型改为int为@CL 提到过,在这里它被声明为日期、时间和时间戳。
步骤2:正如@pskink在注释中所说的那样,插入了所有的datetime值( 10位数)。
步骤3:以秒为单位获得当前日期的开始值和结束值,我使用了以下java代码。
//getCurrentDateTimeInMilliseconds
public void getCurrentDateTimeInMilliseconds() {
Date todayStart = new Date();
Date todayEnd = new Date();
todayStart.setHours(0);
todayStart.setMinutes(0);
todayStart.setSeconds(0);
todayEnd.setHours(23);
todayEnd.setMinutes(59);
todayEnd.setSeconds(59);
long endTime = todayEnd.getTime();
}
使用它,您可以获得当前日期的开始和结束值,如下所示
todayStart.getTime()
它将返回以毫秒为单位的值,即13位值,将其转换为秒,除以1000,如下所示,
long startDateInSeconds = todayStart.getTime/1000;
long startDateInSeconds = todayEnd.getTime/1000;
并根据需求在sqlite查询中使用这些值--在我的示例中--查询如下:
String query = "select * from task where due_date>" + startDateInSeconds + " and due_date<" + startDateInSeconds;
然后在这样的数据库助手类方法中传递查询,
游标=databasehelper.getData(查询);
在DatabaseHelper.java(应该扩展SQLiteOpenHelper类)文件中,执行以下代码:
public Cursor getData(String query) {
SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
return sqLiteDatabase.rawQuery(query, null);
}
最后,在@pskink的帮助下,你的评论帮了我很大的忙。
数据存储在我的数据库里。
发布于 2018-05-24 21:08:03
tl;dr
myPreparedStatement.setObject( // Generally best to use Prepared Statement, to avoid SQL Injection risk.
1 , // Specify which placeholder `?` in your SQL statement.
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) // Determine today’s date as seen in the wall-clock time used by the people of a certain continent/region (a time zone).
.atStartOfDay( ZoneId.of( "Pacific/Auckland" ) ) // Determine the first moment of the day on that date in that zone. Not always 00:00:00.
.toInstant() // Adjust that first moment of the day in that zone to the wall-clock-time of UTC.
.getEpochSecond() // Get a count of whole seconds since the epoch reference of 1970-01-01T00:00:00Z.
)
java.time
现代方法使用的java.time类取代了麻烦的旧的旧日期-时间类。
在这个例子中,due_date列是整数,我只希望在due_date中只匹配今天的日期(当前日期)的记录,而不考虑时间。
LocalDate
LocalDate
类表示一个日期纯值,没有一天的时间,也没有时区.
时区是确定日期的关键。在任何特定时刻,全球各地的日期因地区而异。例如,午夜后几分钟在法国巴黎是一个新的一天,而仍然“昨天”在魁北克省。
如果没有指定时区,JVM将隐式应用其当前默认时区。默认情况在任何时候都可能发生变化,因此您的结果可能会有所不同。最好将所需/预期的时区显式地指定为参数。
以continent/region
格式指定continent/region
,如America/Montreal
、Africa/Casablanca
或Pacific/Auckland
。不要使用3-4字母的缩写,如EST
或IST
,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
如果您想使用JVM当前的默认时区,请请求它并作为参数传递。如果省略,JVM的当前缺省值将被隐式应用。最好是显式的,因为在运行时的任何时刻,JVM中任何应用程序的任何线程中的任何代码都可以更改默认值。
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
划时代秒
我们需要将这个日期转换为一个数字,从1970年时代基准 of the first since of UTC开始的秒数。
要做到这一点,我们需要一天中的第一分钟。让java.time确定第一时刻。不要以为一天从00:00开始。日照节约时间(DST)等异常意味着一天可能在另一个时间开始,如01:00:00。指定一个时区以获取ZonedDateTime
对象。
ZonedDateTime zdt = today.atStartOfDay( z ) ;
我们必须从我们的区域适应世界协调时。最简单的方法是提取一个Instant
。默认情况下,Instant
类总是在UTC中。
Instant instant = zdt.toInstant() ; // Adjust from our zone to UTC.
获取自历代以来的秒数。
long secondsSinceEpoch = instant.getEpochSecond() ;
作为一种快捷方式,我们可以直接从ZonedDateTime
类请求几秒钟的时间.但我想说清楚,我们正在从一个特定的时区调整到世界协调时。
long startSecondsSinceEpoch = zdt.toEpochSecond() ; // Shortcut for adjusting from time zone to UTC, and then getting count of seconds since epoch.
我们还需要结束我们的时间范围,找到所有的记录,其日期是今天的日期。我们将利用第二天的第一个时刻。这遵循了一段时间的半开放定义的通常做法。在半公开赛中,开头是包容性的,而结尾是排他性的。
long stopSecondsSinceEpoch = ld.plusDays( 1 ).atStartOfDay( z ).toEpochSecond() ;
SQL
现在,我们为SQL语句做好了准备。一般来说,最好养成使用预先准备好的陈述的习惯。
String sql = "SELECT when FROM tbl WHERE when >= ? AND when < ? ; " ;
…
myPreparedStatement.setObject( 1 , startSecondsSinceEpoch ) ;
myPreparedStatement.setObject( 2 , stopSecondsSinceEpoch ) ;
关于java.time
http://docs.oracle.com/javase/10/docs/api/java/time/package-summary.html框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
http://www.joda.org/joda-time/项目现在在维护模式中,建议迁移到java.time类。
要了解更多信息,请参见http://docs.oracle.com/javase/tutorial/datetime/TOC.html。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 4.2。不需要字符串,也不需要java.sql.*
类。
在哪里获得java.time类?
三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
和更多。
发布于 2018-05-10 07:46:32
SELECT * FROM your table name where due_date BETWEEN date('now') AND strftime('%Y-%m-%d', due_date)
https://stackoverflow.com/questions/50266543
复制相似问题