向SQL Date添加小时,分钟,秒

美好的一天!

我有SQL日期的问题。 我认为主要问题是从时间的角度来看。 在我的计划中,我有一个开始和结束日期,例如2014-01-082014-01-10 。 在日期库中,我使用了datetime,因此日期分别存储为2014-01-08 00:00:002014-01-10 00:00:00

如果您是用户,今天是结束日期,您可以假设截止日期为午夜。 但是,情况并非如此,因为小时,分钟和秒设置为0。

我想问一下,添加小时,分钟和秒的最佳方法是什么,以便结束日期到午夜。

PS。 我正在使用Java Sql Date。

 INSERT INTO survey_schedule (start_date, end_date) VALUES (startDate, endDate); 

startDate和endDate是java.sql.date类型

如上所述,存储为2013-01-10 00:00:00的日期将转换为2013-01-10 23:59:59.999,然后将其作为结束日期。

MySQL的

DATE_ADD()

查询日期时间字段时,可以按如下方式将结束时间提前一天

 DATE_ADD('your_datetime_field', INTERVAL 1 DAY) 

要么

Java代码

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // rs is ResultSet reference long dt = rs.getTimestamp("your_datetime_field").getTime(); // pick calendar instance and set time Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(dt); // this will print `2013-01-10 00:00:00` System.out.println(sdf.format(calendar.getTime())); // advance the date by 1 day calendar.add(Calendar.Date, 1); // this is print `2013-01-11 00:00:00` System.out.println(sdf.format(calendar.getTime())); 

现在,您也可以与此Calendar对象进行比较。

希望这可以帮助。

没有像“一天结束”这样的事情

您的问题和所有答案的问题是一天结束的定义。 你不能确定一天的结束,因为在一天的最后一秒和新一天的第一个时刻之间存在无限的一秒。

你可能认为你可以弥补这一点。 一个答案谈到java.sql.Date消除分钟和秒,这是真的 – 但你可能需要时间作为你的价值观的一部分。 另一个答案谈到使用几分之一秒的三个小数位。 但是不同的数据库会保存不同数量的小数位,因此您构建的是一个脆弱的假设。 Java 8中的新java.time。*类使用纳秒时间分辨率,这意味着您的应用程序可能具有表示在您的三位小数限制之后发生的时刻的实例。

使用新的一天

表示一段时间的正确方法是记录:

  • 跨度开始的时刻
  • 跨度结束后的时刻

您错过了第二个项目的“之后”部分。

停止时间,即你的最后期限,应该是新的一天的第一时刻。 到期/截止日期之前的有效期包括直到新的一天发生的所有无限时刻。 通过将停止点标记为新的一天,您可以将应用和查询的逻辑写为……

问题的时刻是否GREATER THAN OR EQUAL开始AND是否比停止LESS THAN

请注意,其第二部分包含OR EQUAL TO 。 现在,您要计算在最后一天和新一天的第一个时刻之间的所有分数。

为了说明,这是一个如何定义一周的图表。 这是从我对另一个问题的回答中得到的,给出当前日期和星期开始的周开始和结束日期 。

时间线显示(/> =第1天开始)和(<第8天开始)

乔达时间

在Java工作中,避免使用java.util.Date和Calendar类。 而是在Java 8中使用Joda-Time或新的java.time。*类(受Joda-Time启发)。

第一时刻

不要以为新的一天从00:00:00开始。 有些时区在午夜时分开始夏令时(DST) ,将时钟指针移动到01:00。 Joda-Time包含一种方法,用于确定新一天的第一个时刻: withTimeAtStartOfDay 。 这种方法很聪明,从午夜开始处理DST等exception情况。 Joda-Time中与午夜相关的方法已被弃用或不再推荐。

 DateTime tomorrow = new DateTime().plusDays( 1 ).withTimeAtStartOfDay(); 

时区

实际上,更好的做法是始终指定时区而不是依赖默认值。 所以我会使用更像这样的代码……

 DateTime tomorrow = new DateTime( DateTimeZone.forId( "Europe/Paris" ) ).plusDays( 1 ).withTimeAtStartOfDay(); 

或者,如果使用UTC / GMT(没有时区偏移)……

 DateTime tomorrow = new DateTime( DateTimeZone.UTC ).plusDays( 1 ).withTimeAtStartOfDay(); 

日期时间↔日期

您可以根据需要轻松地在Joda-Time和java.util.Date之间进行转换,以便与其他类交换数据。 将日期传递给Joda-Time构造函数。 toDate()在Joda-Time中调用toDate()方法。

至…

 DateTime myDateTime = new DateTime ( myDate ); 

来回……

 java.util.Date myDate = myDateTime.toDate(); 

这是timestamp数据类型的代码

 Date d=new Date(); Timestamp t=new Timestamp(d.getTime());try{ PreparedStatement pt=con.prepareStatement("INSERT INTO survey_schedule (start_date) VALUES (?);"); pt.setTimestamp(1, start_date); pt.executeUpdate();} catch(Exception e) { System.out.println(e); } 

这是一个将日期和时间存储在mysql数据库中的示例

java.sql.Date存在的全部原因是它不允许小时分钟和秒(由ANSI SQL Date类型定义,并且几乎被RDMBS实现者忽略)。

只要您使用java.sql.Date,就不可能将时间放在数据库中。 如果需要时间,则需要切换到java.sql.Timestamp

如果你问如何计算“一天结束”的实际值,那么最简单的方法就是去第二天并减去1毫秒。

 Calendar cal = Calendar.getInstance(); cal.setTime(endDate); cal.add(Calendar.DATE, 1); java.sql.Timestamp endTime = new java.sql.Timestamp(cal.getTimeInMillis() -1L);