- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我从 SQL Server 获取的 JSON:
https://pastebin.com/raw/xhCnXynA
这是我正在运行的 SQL 脚本:
DECLARE @T TABLE(ID INT,FromDate DATETIME, ToDate DATETIME)
INSERT INTO @T(ID,FromDate,ToDate)
SELECT 1,'20090801','20090803' UNION ALL
SELECT 2,'20090802','20090809' UNION ALL
SELECT 3,'20090805','20090806' UNION ALL
SELECT 4,'20090812','20090813' UNION ALL
SELECT 5,'20090811','20090812' UNION ALL
SELECT 6,'20090802','20090802'
SELECT ROW_NUMBER() OVER(ORDER BY s1.FromDate) AS ID,
s1.FromDate,
MIN(t1.ToDate) AS ToDate
FROM @T s1
INNER JOIN @T t1 ON s1.FromDate <= t1.ToDate
AND NOT EXISTS(SELECT * FROM @T t2
WHERE t1.ToDate >= t2.FromDate
AND t1.ToDate < t2.ToDate)
WHERE NOT EXISTS(SELECT * FROM @T s2
WHERE s1.FromDate > s2.FromDate
AND s1.FromDate <= s2.ToDate)
GROUP BY s1.FromDate
ORDER BY s1.FromDate
结果:
我的 Java 代码:
//Date Format
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Integer downTime;
while (rs.next()) {
//Parse to Date
eventStart = formatter.parse(rs.getString("EventStart"));
eventEnd = formatter.parse(rs.getString("EventEnd"));
if (eventStart.after(eventEnd)){
//How should I do this?
}
else{
//How should I do this?
}
//I have to count here the difference between the dates in minutes
}
最佳答案
最好使用新 Java 日期/时间 API 中的 java.time.format.DateTimeFormatter
和 java.time.LocalDateTime
而不是 SimpleDateFormat
> 和日期
:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
LocalDateTime eventStart = LocalDateTime.parse("2019-10-09 01:24:05.0", formatter);
LocalDateTime eventEnd = LocalDateTime.parse("2019-10-09 01:35:14.0", formatter);
Duration duration;
if (eventStart.isBefore(eventEnd)) {
duration = Duration.between(eventStart, eventEnd);
} else {
duration = Duration.between(eventEnd, eventStart);
}
long minutes = duration.toMinutes();
System.out.println("" + minutes + " minute(s)");
结果是:11 分钟
。
要合并所有重叠的日期范围,请考虑以下方法。
使用方法 isOverlappingWith
、mergeWith
、toMinutes
创建一个类来表示日期范围,并覆盖 equals
和哈希码
。
private static class DateRange {
private final LocalDateTime startDate;
private final LocalDateTime endDate;
public DateRange(LocalDateTime startDate, LocalDateTime endDate) {
this.startDate = startDate;
this.endDate = endDate;
}
public boolean isOverlappingWith(DateRange other) {
return !startDate.isAfter(other.endDate) && !endDate.isBefore(other.startDate);
}
public DateRange mergeWith(DateRange other) {
return new DateRange(
startDate.isBefore(other.startDate) ? startDate : other.startDate,
endDate.isAfter(other.endDate) ? endDate : other.endDate);
}
public long toMinutes() {
return Duration.between(startDate, endDate).toMinutes();
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
DateRange dateRange = (DateRange) o;
return Objects.equals(startDate, dateRange.startDate) &&
Objects.equals(endDate, dateRange.endDate);
}
@Override
public int hashCode() {
return Objects.hash(startDate, endDate);
}
@Override
public String toString() {
return "DateRange{" +
"startDate=" + startDate +
", endDate=" + endDate +
'}';
}
}
迭代所有日期范围并尝试合并它们。为了跟踪重复项,需要额外的HashSet
。这个想法是尝试将每个日期范围与列表中的下一个范围合并。如果至少有一次合并,则删除原始日期范围。如果列表不包含生成的合并日期范围,则将其附加到列表中。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
List<List<String>> rawDateRanges = List.of(
List.of("2009-08-01 00:00:00.0", "2009-08-03 00:00:00.0"),
List.of("2009-08-05 00:00:00.0", "2009-08-06 00:00:00.0"),
List.of("2009-08-02 00:00:00.0", "2009-08-09 00:00:00.0"),
List.of("2009-08-12 00:00:00.0", "2009-08-13 00:00:00.0"),
List.of("2009-08-11 00:00:00.0", "2009-08-12 00:00:00.0"),
List.of("2009-08-02 00:00:00.0", "2009-08-02 00:00:00.0"));
List<DateRange> dateRanges = new ArrayList<>();
for (List<String> rawDateRange : rawDateRanges) { //Replace with while (rs.next()) { ... }
LocalDateTime fromDate = LocalDateTime.parse(rawDateRange.get(0), formatter);
LocalDateTime toDate = LocalDateTime.parse(rawDateRange.get(1), formatter);
dateRanges.add(new DateRange(fromDate, toDate));
}
Set<DateRange> mergedDateRanges = new HashSet<>();
for (int i = 0; i < dateRanges.size(); i++) {
DateRange dateRange = dateRanges.get(i);
boolean merged = false;
for (int j = i + 1; j < dateRanges.size(); j++) {
DateRange otherDateRange = dateRanges.get(j);
if (dateRange.isOverlappingWith(otherDateRange)) {
dateRange = dateRange.mergeWith(otherDateRange);
merged = true;
}
}
if (merged) {
dateRanges.remove(i--);
if (mergedDateRanges.add(dateRange)) {
dateRanges.add(dateRange);
}
}
}
List<Long> minutes = dateRanges.stream()
.peek(System.out::println)
.map(DateRange::toMinutes) //Convert to minutes
.collect(toList());
System.out.println(minutes);
输出:
DateRange{startDate=2009-08-01T00:00, endDate=2009-08-09T00:00}
DateRange{startDate=2009-08-11T00:00, endDate=2009-08-13T00:00}
[11520, 2880]
关于Java - 以分钟为单位计算差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60614942/
SQL 和一般开发的新手,我有一个表(COUNTRIES),其中包含字段(INDEX、NAME、POPULATION、AREA) 通常我添加一个客户端(Delphi)计算字段(DENSITY)和 On
我想使用 calc(100%-100px),但在我的 demo 中不起作用由于高度只接受像素,因此如何将此百分比值转换为像素。 最佳答案 以下将为您提供高度: $(window).height();
我正在尝试在 MySQL 中添加列并动态填充其他列。 例如我有一张表“数字”并具有第 1 列、第 2 列、第 3 列,这些总数应填充在第 4 列中 最佳答案 除非我误解了你的问题,否则你不只是在寻找:
我想返回简单计算的结果,但我不确定如何执行此操作。我的表格如下: SELECT COUNT(fb.engineer_id) AS `total_feedback`, SUM(fb.ra
我一直在尝试做这个程序,但我被卡住了,我仍然是一个初学者,任何帮助将不胜感激。我需要程序来做 打印一个 10 X 10 的表格,其中表格中的每个条目都是行号和列号的总和 包含一个累加器,用于计算所有表
这个计算背后一定有一些逻辑。但我无法得到它。普通数学不会导致这种行为。谁能帮我解释一下原因 printf ("float %f\n", 2/7 * 100.0); 结果打印 1.000000 为什么会
我想计算从 0 到 (n)^{1/2} - 1 的数字的 AND每个数字从 0 到 (n)^{1/2} - 1 .我想在 O(n) 中执行此操作时间,不能使用 XOR、OR、AND 运算。 具体来说,
如何在 Excel 中将公式放入自定义数字格式?例如(出于说明目的随机示例), 假设我有以下数据: 输入 输出 在不编辑单元格中的实际数据的情况下,我想显示单元格中的值除以 2,并保留两位小数: 有没
每次我在 Flutter 应用程序中调用计算()时,我都会看到内存泄漏,据我所知,这基本上只是一种生成隔离的便捷方法。我的应用程序内存占用增加并且在 GC 之后永远不会减少。 我已将我的代码简化为仅调
我有数字特征观察 V1通过 V12用于目标变量 Wavelength .我想计算 Vx 之间的 RMSE列。数据格式如下。 每个变量“Vx”以 5 分钟的间隔进行测量。我想计算所有 Vx 变量的观测值
我正在寻找一种使用 C 语言计算文件中未知字符数的简单方法。谢谢你的帮助 最佳答案 POSIX 方式(可能是您想要的方式): off_t get_file_length( FILE *file ) {
我正在使用 Postgres,并且我正试图围绕如何在连续日期跨度中得出第一个开始日期的问题进行思考。例如 :- ID | Start Date | End Date =================
我有一个订单表格,我在其中使用 jQuery 计算插件来汇总总数。 此求和工作正常,但生成的“总和”存在问题。总之,我希望用逗号替换任何点。 代码的基础是; function ($this) {
我在使用 double 变量计算简单算术方程时遇到问题。 我有一个具有 double 属性 Value 的组件,我将此属性设置为 100。 然后我做一个简单的减法来检查这个值是否真的是 100: va
我在这里看到了一些关于 CRC 32 计算的其他问题。但没有一个让我满意,因此是这样。 openssl 库是否有任何用于计算 CRC32 的 api 支持?我已经在为 SHA1 使用 openssl,
当我在PHP日期计算中遇到问题时,我感到惊讶。 $add = '- 30 days'; echo date('Y-m-01', strtotime($add)); // result is 2017-
我正在使用 javascript 进行练习,我编写了这个脚本来计算 2 个变量的总和,然后在第三个方程中使用这个总和!关于如何完成这项工作的任何想法都将非常有用! First Number:
我有一个来自EAC的提示单和一个包含完整专辑的FLAC文件。 我正在尝试制作一些python脚本来播放文件,因为我需要能够设置在flac文件中开始的位置。 如何从CueSheet格式MM:SS:FF转
这个问题已经有答案了: Adding two numbers concatenates them instead of calculating the sum (24 个回答) 已关闭去年。 我有一个
4000 我需要上面字段 name="quantity" 和 id="price" 中的值,并使用 javascript 函数进行计算,并将其显示在字段 id= 中仅当我单击计算按钮时才显示“总
我是一名优秀的程序员,十分优秀!