首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不考虑时间的情况下从包含当前日期的unixtime(整数)列中选择记录?

如何在不考虑时间的情况下从包含当前日期的unixtime(整数)列中选择记录?
EN

Stack Overflow用户
提问于 2018-05-10 06:07:39
回答 3查看 440关注 0票数 3

我在Android SQLite数据库中有一个包含以下字段的表。

在这里,due_date列是整数,我只想要在due_date 中单独匹配今天的日期(当前日期)的记录,而不考虑时间

例如:如果有3个与当前日期匹配的值,则需要来返回所有3行

注意:在我的例子中,必须与当前日期进行比较,而不是使用当前时间戳,但我的列类型是具有unix-epoch值的整数。我的unix时代的例子是"1526565900000".。

我试过:

代码语言:javascript
运行
复制
 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时代的值,在此之前,我的所有列都是时间戳。

EN

回答 3

Stack Overflow用户

发布于 2018-05-24 15:58:45

步骤1:首先将列类型改为int为@CL 提到过,在这里它被声明为日期、时间和时间戳。

步骤2:正如@pskink在注释中所说的那样,插入了所有的datetime值( 10位数)。

步骤3:以秒为单位获得当前日期的开始值和结束值,我使用了以下java代码。

代码语言:javascript
运行
复制
//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();
    }

使用它,您可以获得当前日期的开始和结束值,如下所示

代码语言:javascript
运行
复制
todayStart.getTime()

它将返回以毫秒为单位的值,即13位值,将其转换为秒,除以1000,如下所示,

代码语言:javascript
运行
复制
long startDateInSeconds = todayStart.getTime/1000;
long startDateInSeconds = todayEnd.getTime/1000;

并根据需求在sqlite查询中使用这些值--在我的示例中--查询如下:

代码语言:javascript
运行
复制
String query = "select * from task where due_date>" + startDateInSeconds + " and due_date<" + startDateInSeconds;

然后在这样的数据库助手类方法中传递查询,

游标=databasehelper.getData(查询);

在DatabaseHelper.java(应该扩展SQLiteOpenHelper类)文件中,执行以下代码:

代码语言:javascript
运行
复制
public Cursor getData(String query) {
        SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
        return sqLiteDatabase.rawQuery(query, null);
    }

最后,在@pskink的帮助下,你的评论帮了我很大的忙。

数据存储在我的数据库里。

票数 0
EN

Stack Overflow用户

发布于 2018-05-24 21:08:03

tl;dr

代码语言:javascript
运行
复制
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/MontrealAfrica/CasablancaPacific/Auckland。不要使用3-4字母的缩写,如ESTIST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。

代码语言:javascript
运行
复制
ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

如果您想使用JVM当前的默认时区,请请求它并作为参数传递。如果省略,JVM的当前缺省值将被隐式应用。最好是显式的,因为在运行时的任何时刻,JVM中任何应用程序的任何线程中的任何代码都可以更改默认值。

代码语言:javascript
运行
复制
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对象。

代码语言:javascript
运行
复制
ZonedDateTime zdt = today.atStartOfDay( z ) ;

我们必须从我们的区域适应世界协调时。最简单的方法是提取一个Instant。默认情况下,Instant类总是在UTC中。

代码语言:javascript
运行
复制
Instant instant = zdt.toInstant() ;  // Adjust from our zone to UTC.

获取自历代以来的秒数。

代码语言:javascript
运行
复制
long secondsSinceEpoch = instant.getEpochSecond() ;  

作为一种快捷方式,我们可以直接从ZonedDateTime类请求几秒钟的时间.但我想说清楚,我们正在从一个特定的时区调整到世界协调时。

代码语言:javascript
运行
复制
long startSecondsSinceEpoch = zdt.toEpochSecond() ;  // Shortcut for adjusting from time zone to UTC, and then getting count of seconds since epoch.

我们还需要结束我们的时间范围,找到所有的记录,其日期是今天的日期。我们将利用第二天的第一个时刻。这遵循了一段时间的半开放定义的通常做法。在半公开赛中,开头是包容性的,而结尾是排他性的。

代码语言:javascript
运行
复制
long stopSecondsSinceEpoch = ld.plusDays( 1 ).atStartOfDay( z ).toEpochSecond() ;

SQL

现在,我们为SQL语句做好了准备。一般来说,最好养成使用预先准备好的陈述的习惯。

代码语言:javascript
运行
复制
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.DateCalendarSimpleDateFormat

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 8Java 9Java 10,以及后来的
    • 内置的。
    • 带有捆绑实现的标准Java的一部分。
    • Java 9添加了一些次要的特性和修复。

  • Java 6Java 7
    • java.time的大部分功能都是在http://www.threeten.org/threetenbp/中移植到Java6&7中的。

  • 安卓
    • 较晚版本的Android实现的java.time类。
    • 对于早期的Android (<26),https://github.com/JakeWharton/ThreeTenABP项目采用了http://www.threeten.org/threetenbp/ (上面提到的)。见http://stackoverflow.com/q/38922754/642706

三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter更多

票数 0
EN

Stack Overflow用户

发布于 2018-05-10 07:46:32

代码语言:javascript
运行
复制
SELECT * FROM your table name where due_date BETWEEN date('now') AND strftime('%Y-%m-%d', due_date)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50266543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档