我在数据库中有start_time
和end_time
列,其中包含毫秒值。
start_time> 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
查询获取所有记录?
注意:我不想比较当前时间,我希望所有持续时间明白日期。
答案 0 :(得分:1)
使用
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))
答案 1 :(得分:0)
首先,将Unix纪元以来的毫秒转换为日期和时间取决于时区。您提供的样本值对应于2月14日上午5:30(UTC)。由于您将其翻译为上午11点,看起来您的时区与UTC,Lemme guess,印度或斯里兰卡相差+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());
}
我用你问题中的4个案例打电话给它:
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日期和时间API及其Duration
类。您可以在Android上使用java.time
吗?是的,你可以,它只需要至少Java 6。
java.time
内置。org.threeten.bp
和子包中导入日期和时间类。我在演示中使用的toMinutesPart
方法仅在Java 9中引入。在早期的Java和backport中,您仍然可以使用toMinutes()
来获取Duraiotn
中的总分钟数,Duration.toString()
将告诉您ISO 8601格式的小时和分钟数,例如PT11H30M
11小时30分钟。
java.time
。