java中相同的日期获得最大和最小的时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中相同的日期获得最大和最小的时间相关的知识,希望对你有一定的参考价值。

比如有
2011-09-12 10:30:00
2011-09-12 7:30:00
2011-09-12 13:30:00
2011-09-12 17:30:00
2011-09-13 10:30:00
2011-09-13 12:30:00
2011-09-13 14:30:00
...
在这些日期里我想获得
2011-09-12 7:30:00
2011-09-12 17:30:00
2011-09-13 10:30:00
2011-09-13 14:30:00
怎么实现
如果再加一个条件,同一人的相同日期的最大最小值怎么办

参考技术A 没有排序,如果你需要排序,你可以把时间取在一个数组里面再排一次序。
这个我想你自己应该可以解决吧。

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;

public class DateTimeSequence
public static void main(String[] args)
try
String[] dt = "2011-09-12 10:30:00", "2011-09-12 07:30:00", "2011-09-12 13:30:00",
"2011-09-12 17:30:00", "2011-09-13 10:30:00", "2011-09-13 12:30:00",
"2011-09-13 14:30:00" ;
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat datefmt = new SimpleDateFormat("yyyy-MM-dd");
Hashtable hs=new Hashtable();
for (int i = 0; i < dt.length; i++)
Date datetime= fmt.parse(dt[i]);
String date=datefmt.format(datetime);
Object first=hs.get(date+"_first");
Object last=hs.get(date+"_last");
if(first==null)
hs.put(date+"_first", datetime);
else
if(datetime.before((Date)first))
hs.put(date+"_first", datetime);


if(last==null)
hs.put(date+"_last", datetime);
else
if(datetime.after((Date)last))
hs.put(date+"_last", datetime);



Enumeration em=hs.keys();
while(em.hasMoreElements())
System.out.println(fmt.format(hs.get(em.nextElement())));

catch (Exception e)
// TODO: handle exception


参考技术B 难道是OA打卡啥的?
不过你取的数据希望能更规范些,2011-09-12 07:30:00 位数统一些你也通过SimpleDateFormate转换, 最起码转换后就可以比大小的了

--思路是这样,具体的还需要再考虑
参考技术C 相同日期的最大时间
select max(to_char(columns,'yyyy-mm-dd hh:mi:ss'))
from tablename
group by to_char(columns,'yyyymmdd')
相同日期的最小时间
select min(to_char(columns,'yyyy-mm-dd hh:mi:ss'))
from tablename
group by to_char(columns,'yyyymmdd')
参考技术D 楼主告诉你一个思路,把上面的日期时间转换成整型,然后比较大小就可以了!
楼上利用数组排序也是可取的!赞同
第5个回答  2011-03-22 简单的做法是 把 2011-09-12 10:30:00 2011-09-12 7:30:00
变成 20110912103000 20110912073000
比数字大小去吧。

SQL选择具有最大和最小日期的行

【中文标题】SQL选择具有最大和最小日期的行【英文标题】:SQL Select rows with max and min date 【发布时间】:2011-11-01 13:16:31 【问题描述】:

我试图一次从一张表中获取 2 行。上周的最短日期时间(今天 - 7)和最新的(今天)。 我的桌子:

|id  |dataIn |dataOut|date                   |MachineId                            |
-----+-------+-------+-----------------------+-------------------------------------+
|1   |5006   |58     |2011-10-25 09:03:17.000|7B788EE88E-6527-4CB4-AA4D-01B7F4048559  
|2   |1200   |130    |2011-10-26 12:45:43.000|7B788EE88E-6527-4CB4-AA4D-01B7F4048559 
        ...  
|124 |1350   |480    |2011-10-29 13:29:04.000|7B788EE88E-6527-4CB4-AA4D-01B7F4048559  
|125 |8005   |560    |2011-10-31 21:18:35.000|7B788EE88E-6527-4CB4-AA4D-01B7F4048559  

我可以选择上周的数据:

SELECT 
dbo.myDatabase.Date AS [date], dbo.myDatabase.dataIn AS [in], 
dbo.myDatabase.dataOut AS [out] 
FROM 
dbo.myDatabase WHERE 
Date >=dateadd(day,datediff(day,0,GetDate())- 7,0) 
AND 
dbo.myDatabase.MachineId = '7B788EE88E-6527-4CB4-AA4D-01B7F4048559' 

但我只想要第 1 行和第 125 行,因为这些行用于我的计算。 所以我的问题是: 如何从上一个查询的结果中选择 2 行(具有 MIN 和 MAX 日期)?

【问题讨论】:

最小或最大日期可能不止一行。那你想做什么? 日期/时间戳是否与明显的自动增量 ID 列直接相关??? @TimRogers 否。每台机器在有变化时插入一行带有日期时间的行,因此它是唯一的/机器 @DRapp 没有相关性。我只是想做的是获得一周的总 IN 和总 Out,这是过去 7 天内第一行和最后一行的 dataIn/dataOut 之间的差异。 【参考方案1】:

你可以用这个:

select * from dbo.myDatabase 
where 
    ([Date] = (select max([Date]) from /* your query */ ) or 
    [Date] = (select min([Date]) from /* your query */ ))
    and MachineId = '7B788EE88E-6527-4CB4-AA4D-01B7F4048559' -- or any other id

编辑:由于两台机器完全有可能具有相同的date 值,因此应更新查询以在where 子句中也包含MachineId 过滤器。我更新了查询以显示这一点。

【讨论】:

请参阅我的回答中的说明......您的查询完全依赖于 Date 是否相等将起作用,但也会返回与给定日期匹配的任何内容的多条记录 - 即使在不同的机器上发送数据。 @DRapp 我明白你关于返回与日期匹配的所有内容的观点,即使是不同的MachineId。我更新了我的答案来解决这个问题。 如果你有组,你会怎么做 - 这意味着每个组都有一个 max(date) ...【参考方案2】:

如果您有多个具有相同日期的行,此查询将确保只返回一行作为最小值/最大值(仅适用于 Sql 2005+)。

;WITH dates 
     AS (SELECT dbo.Mydatabase(id)                    AS id, 
                dbo.mydatabase.DATE                   AS [date], 
                dbo.mydatabase.datain                 AS [in], 
                dbo.mydatabase.dataout                AS [out], 
                Row_number() OVER (ORDER BY DATE ASC) AS row 
         FROM   dbo.mydatabase 
         WHERE  DATE >= Dateadd(DAY, Datediff(DAY, 0, Getdate()) - 7, 0) 
                AND dbo.mydatabase.machineid = 
                    '7B788EE88E-6527-4CB4-AA4D-01B7F4048559'), 
     dates2 
     AS (SELECT id, 
                DATE, 
                in, 
                OUT, 
                row, 
                MIN(row) OVER (PARTITION BY (SELECT NULL)) AS lowest_row, 
                MAX(row) OVER (PARTITION BY (SELECT NULL)) AS highest_row 
         FROM   dates) 
SELECT id, 
       DATE, 
       in, 
       OUT 
FROM   dates2 
WHERE  row = lowest_row 
        OR row = highest_row 

【讨论】:

+1 但您可能会在 Row_number 中添加另一个字段(例如ORDER BY DATE ASC , dbo.Mydatabase(id) ASC),以使决胜局更具确定性。 如果窗口聚合函数应用于整个行集,您可以简单地省略PARTITION BY 子句(例如:MIN (row) OVER () AS lowest_row)。 @Andriy M - 通过省略 PARTITION BY (SELECT NULL) 是否有可能提高性能?就我个人而言,我发现使用它更具可读性,但那可能只是我! @Davin:很难说,部分原因是我以前可能从未遇到过PARTITION BY (SELECT NULL)。不过,我不希望有任何区别。【参考方案3】:

从读取 cmets 和每台机器执行自己的 INSERT 开始,插入不会插入自动增量列的值,因为该值由引擎处理。因此,除非机器正在更改其日期/时间,否则自动增量 ID 与每台机器的日期/时间直接相关。所以,就是说,我创建的样本获得了每个机器的最小和最大 ID,其中日期/时间是合格的,将导致相关范围的确定的第一个和最后一个 ID。然后就可以得到具体的ID记录了。

所以,如果您有 3 台机器,并且它们同时执行插入操作,那么它们各自的 ID 会以不同的方式生成...

|id  |date                   |MachineId                            |
-----+-------+-------+-----------------
|1   |2011-10-25 09:03:17.000| A
|2   |2011-10-25 09:03:17.000| B
|3   |2011-10-25 09:03:17.000| C

|4   |2011-10-26 12:45:43.000| B
|5   |2011-10-26 12:45:43.000| A
|6   |2011-10-26 12:45:43.000| C

        ...  

|124 |2011-10-29 13:29:04.000| C
|125 |2011-10-29 13:29:04.000| A
|126 |2011-10-29 13:29:04.000| B

|127 |2011-10-31 21:18:35.000| C
|128 |2011-10-31 21:18:35.000| B
|129 |2011-10-31 21:18:35.000| A

The first and last IDs per respective machine would become
Machine First ID   Last ID
A         1         129
B         2         128
C         3         127

内部预查询执行一次(根据特定机器),因此您将获得与每个机器日期/时间段的第一个/最后一个实例关联的 ID。然后在 ID 匹配上使用 OR 将其连接回表中以获取实际数据。

select 
      D2.*
   FROM
      ( SELECT 
              min( D1.ID ) MinDateID,
              max( D1.ID ) MaxDateID
           from
              dbo.myDatabase D1
           where
                  D1.MachineId = '7B788EE88E-6527-4CB4-AA4D-01B7F4048559' 
              AND D1.Date >=dateadd(day,datediff(day,0,GetDate())- 7,0)
      ) PreQuery
      JOIN dbo.MyDatabase D2
         on PreQuery.MinDateID = D2.ID
         OR PreQuery.MaxDateID = D2.ID

【讨论】:

根据 OP 对该问题的评论,IDs 与最小和最大日期无关。但是,只需稍作更改即可选择最小和最大日期。 @user798612,请参阅每个示例数据上下文的答案中的说明

以上是关于java中相同的日期获得最大和最小的时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在列表日期中获取最大和最小日期就像 java 中的 String ''17.03.2020", ''12.03.2020", ''01.02.2020" [关闭]

索引匹配最大/最小分数 (Java)

Android 1.5 中 onDateChanged() 中具有最大和最小日期的日期选择器?

获取csv中每个日期的最小和最大日期时间

比较三个变量并获得最小/最大值的变量(不是值)

在C#中如何获得以Unicode格式打印的char的最小值和最大值?