将第一行的结束时间设置为下一行的开始时间

时间:2017-04-27 06:34:17

标签: vb.net sql-server-2008 datatable

我的表格包含以下数据:

Id | Start         | End          | Used
----------------------------------------
1  | 27-04-17 2:00 |27-04-17 0:00 | 1:30
---------------------------------------
2  | 27-04-17 2:00 |27-04-17 0:00 | 23:00
---------------------------------------
3  | 27-04-17 2:00 |27-04-17 0:00 | 1:00
---------------------------------------
4  | 28-04-17 2:00 |28-04-17 0:00 | 0:30 
---------------------------------------
5  | 30-04-17 2:00 |30-04-17 0:00 | 3:30
---------------------------------------

我想将其设置为

Id | Start         | End          | Used
----------------------------------------
1  | 27-04-17 2:00 |27-04-17 3:30 | 1:30
---------------------------------------
2  | 27-04-17 3:30 |28-04-17 2:30 | 23:00
---------------------------------------
3  | 28-04-17 2:30 |28-04-17 3:30 | 1:00
---------------------------------------
4  | 28-04-17 3:30 |28-04-17 4:00 | 0:30 
---------------------------------------
5  | 30-04-17 2:00 |30-04-17 4:30 | 2:30
---------------------------------------

我想将前一个id的结束时间设置为下一个id的开始时间,其中第一个id的开始时间由用户设置。
结束时间是开始时间和使用时间的总和我使用vb。数据库的净数据表和SQL服务器。
要在第一行设置值,我使用SQL函数DATEADD(),通过它添加两个小时,并在结束日期添加时间相同的函数。
我想复制下一行中前一行的结束日期,以便整个计算正常工作。
我可以通过SQL进行吗?或者我需要一个函数来在Vb.net数据表中执行它,它将用于报告。
注意:ID序列可以更改
感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

下面的递归CTE逻辑将为您提供所需的输出。

String s = "x = 123 & y = abc & dateFrom >= 1234500000 & dateTo <= 654870000";
Pattern pattern = Pattern.compile("(\\d+)");
Matcher matcher = pattern.matcher(s);

SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
long min = 200;

Map<String, String> map = new HashMap<>();
while(matcher.find()) {
  String longStr = matcher.group();
  long l = Long.valueOf(longStr);
  if(l > min) {
    String dateStr = sdf.format(new Date(l));
    map.put(longStr, dateStr);
    System.out.println("Replace " + longStr + " with " + dateStr);
  }
}

for (Map.Entry<String, String> entry : map.entrySet()) {
  s = s.replaceAll(entry.getKey(), entry.getValue());
}

System.out.println(s);