从表中选择记录,其中unixtime(整数)列包含当前日期而不考虑时间

时间:2018-05-10 06:07:40

标签: android sqlite datetime timestamp android-sqlite

我在android sqlite数据库中有一个包含以下字段的表。 enter image description here

在此,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 值。

由于我已经搜索了很多我的确切要求,我找不到任何答案,所以请回答这个问题,而不是对此进行投票。

希望这个问题对很多用户有所帮助,谢谢。

2 个答案:

答案 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的帮助下钉了它,谢谢你的评论给了我很多帮助。

数据存储在我的数据库中。 enter image description here

答案 1 :(得分:0)

TL;博士

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列是INTEGER,我只想在due_date中单独匹配今天的日期(当前日期),而不考虑时间。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

如果未指定时区,则JVM会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的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

现在我们已经准备好了SQL语句。通常最好养成使用预备陈述的习惯。

String sql = "SELECT when FROM tbl WHERE when >= ? AND when < ? ; " ;
…
myPreparedStatement.setObject( 1 , startSecondsSinceEpoch ) ;
myPreparedStatement.setObject( 2 , stopSecondsSinceEpoch ) ;  

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore