我在android sqlite数据库中有一个包含以下字段的表。
在此,due_date列是INTEGER,我只想在due_date 中单独匹配今天的日期(当前日期)而不考虑时间。
例如:如果我有3个值与当前日期匹配,我需要返回所有3行
注意:在我的情况下,必须与当前日期进行比较,而不是与当前日期进行比较 时间戳,但我的列类型为 INTEGER,具有unix-epoch值。 我的unix-epoch示例是“ 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;
这也不符合我的要求。
最后,根据以下评论,我更改了我的所有日期时间和 时间戳列进入 INTEGER ,以便在我的所有列都在时间戳之前存储为 unix-epoch 值。
由于我已经搜索了很多我的确切要求,我找不到任何答案,所以请回答这个问题,而不是对此进行投票。
希望这个问题对很多用户有所帮助,谢谢。
答案 0 :(得分:0)
第1步:首先,我将列类型更改为int为@CL mentioned,其中它被声明为datetime和timestamp之前。
第2步:然后插入所有日期时间值,以秒为单位(10位数),如@pskink在评论中所述。
第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类的方法中传递查询,如下所示,
Cursor cursor = databasehelper.getData(query);
在DatabaseHelper.java(应扩展SQLiteOpenHelper类)文件中执行以下代码:
public Cursor getData(String query) {
SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
return sqLiteDatabase.rawQuery(query, null);
}
最后在@pskink的帮助下钉了它,谢谢你的评论给了我很多帮助。
答案 1 :(得分:0)
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 类来取代麻烦的旧遗留日期时间类。
在此,due_date列是INTEGER,我只想在due_date中单独匹配今天的日期(当前日期),而不考虑时间。
LocalDate
LocalDate
类表示没有时间且没有时区的仅限日期的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
如果未指定时区,则JVM会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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.
我们需要将该日期转换为一个数字,即自epoch reference中1970年第一时刻UTC以来的秒数。
要做到这一点,我们需要获得当天的第一时刻。让 java.time 确定第一时刻。不要假设这一天从00:00:00开始。夏令时(DST)等异常表示该日可能会在另一个时间开始,例如01:00:00。指定时区以获取ZonedDateTime
对象。
ZonedDateTime zdt = today.atStartOfDay( z ) ;
我们必须从我们的区域调整为UTC。最简单的方法是提取Instant
。默认情况下,Instant
类始终为UTC。
Instant instant = zdt.toInstant() ; // Adjust from our zone to UTC.
获取自纪元以来的秒数。
long secondsSinceEpoch = instant.getEpochSecond() ;
作为一种捷径,我们可以直接从ZonedDateTime
班级询问秒数。但我想明确表示我们正在调整从特定时区到UTC。
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语句。通常最好养成使用预备陈述的习惯。
String sql = "SELECT when FROM tbl WHERE when >= ? AND when < ? ; " ;
…
myPreparedStatement.setObject( 1 , startSecondsSinceEpoch ) ;
myPreparedStatement.setObject( 2 , stopSecondsSinceEpoch ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。