我在数据库中有带有start_time
和end_time
列的毫秒值。
start_time > Wed 2018年2月14日11:00:00(实际日期)=1518586200000(数据库值)
现在,我要所有的记录,在特定的一天的持续时间。
例如。日期:2018年2月14日
案例1 :
Start Time : 14/02/2018 11:00 AM
End Time : 14/02/2018 11:30 AM
Result : Appear (30 min)
案例2 :
Start Time : 13/02/2018 11:00 AM (start date change)
End Time : 14/02/2018 11:30 AM
Result : Appear (11 hour 30 min)
案例3 :
Start Time : 14/02/2018 11:00 AM
End Time : 15/02/2018 11:30 AM (end date change)
Result : Appear (13 hour)
案例4 :
Start Time : 13/02/2018 11:00 AM (start date change)
End Time : 16/02/2018 11:30 AM (end date change)
Result : Appear (24 hour)
是否可以使用sqlite
查询获取所有记录?
注意:我不想比较当前的时间,我希望所有的持续时间都是明智的。
发布于 2018-02-14 13:01:02
使用
input date = 14/02/2018;
使用以下变量beginning_of_day
和end_of_day
;
// beginning_of_day indicates first hour of input_date
beginning_of_day = 14/02/2018 00:00 a.m. // in millisecond format
// end_of_day indicates end hour of input_date (or) the first hour of next valid date of input_date
end_of_day = 15/02/2018 00:00 a.m. // in millisecond format
然后您可以使用以下where子句;
WHERE NOT ((start_time<beginning_of_day AND end_time<beginning_of_day) OR (start_time>end_of_day AND end_time>end_of_day))
发布于 2018-02-15 02:20:52
首先,从Unix时代到日期和时间的毫秒转换取决于时区。你给出的样本值对应于世界协调时凌晨5:30的2月14日。既然你把它翻译成上午11点,你的时区似乎是从世界协调时,莱姆猜测,印度或斯里兰卡的偏移+05:30?
其次,我不知道这在SQLite中是否可行。它当然是用Java编写的,当您知道如何使用时,这并不难。下面的方法将完成这项工作;
public static ZoneId zone = ZoneId.of("Asia/Colombo");
public static Duration dateAppearingBetweenTimestamps(LocalDate date, long start, long end) {
if (end < start) {
throw new IllegalArgumentException("end must be on or after start");
}
Instant startOfDay = date.atStartOfDay(zone).toInstant();
Instant startOfNextDay = date.plusDays(1).atStartOfDay(zone).toInstant();
Instant startTime = Instant.ofEpochMilli(start);
Instant endTime = Instant.ofEpochMilli(end);
if (endTime.isBefore(startOfDay) || startTime.isAfter(startOfNextDay)) {
return Duration.ZERO;
}
if (startTime.isBefore(startOfDay)) {
startTime = startOfDay;
}
if (endTime.isAfter(startOfNextDay)) {
endTime = startOfNextDay;
}
return Duration.between(startTime, endTime);
}
为了演示,我做了这个小辅助方法:
public static void demo(String start, String end) {
long startTimestamp
= LocalDateTime.parse(start).atZone(zone).toInstant().toEpochMilli();
long endTimestamp
= LocalDateTime.parse(end).atZone(zone).toInstant().toEpochMilli();
Duration result = dateAppearingBetweenTimestamps(
LocalDate.of(2018, Month.FEBRUARY, 14), startTimestamp, endTimestamp);
System.out.format("%13d %16s %14d %16s = %2d hours %2d minutes%n",
startTimestamp, start, endTimestamp, end, result.toHours(), result.toMinutesPart());
}
我用你问题中的四个案例来说明这一点:
demo("2018-02-14T11:00", "2018-02-14T11:30");
demo("2018-02-13T11:00", "2018-02-14T11:30");
demo("2018-02-14T11:00", "2018-02-15T11:30");
demo("2018-02-13T11:00", "2018-02-16T11:30");
印刷本:
1518586200000 2018-02-14T11:00 1518588000000 2018-02-14T11:30 = 0 hours 30 minutes
1518499800000 2018-02-13T11:00 1518588000000 2018-02-14T11:30 = 11 hours 30 minutes
1518586200000 2018-02-14T11:00 1518674400000 2018-02-15T11:30 = 13 hours 0 minutes
1518499800000 2018-02-13T11:00 1518760800000 2018-02-16T11:30 = 24 hours 0 minutes
在所有情况下,输出时间和分钟都符合您的预期。
我正在使用和推荐java.time
,现代Java和time及其Duration
类。你能在机器人上使用java.time
吗?是的,你可以,它只需要至少Java 6。
java.time
内置。org.threeten.bp
和子包导入日期和时间类。不过,我在演示中使用的toMinutesPart
方法只是在Java9中介绍的。在早期的Java和backports中,您仍然可以使用toMinutes()
获取Duraiotn
中的总分钟数,Duration.toString()
将以ISO 8601格式告诉您时间和分钟,例如11小时30分钟的PT11H30M
。
链接
java.time
。https://stackoverflow.com/questions/48787531
复制相似问题