Java 向SQL日期添加小时、分钟、秒

Java 向SQL日期添加小时、分钟、秒,java,mysql,Java,Mysql,你好 我对SQL日期有问题。我认为主要问题在于时间的角度。 在我的程序中,我有一个开始和结束日期,例如2014-01-08和2014-01-10。 在数据库中,我使用了datetime,因此日期分别存储为2014-01-08 00:00:00和2014-01-10 00:00:00 如果您是一个用户,并且今天是结束日期,那么您将假定截止日期是午夜。但是,情况并非如此,因为小时、分钟和秒设置为0 我想问一下,添加小时、分钟和秒的最佳方式是什么,这样结束日期可以一直到午夜 另外,我使用的是Java

你好

我对SQL日期有问题。我认为主要问题在于时间的角度。 在我的程序中,我有一个开始和结束日期,例如
2014-01-08
2014-01-10
。 在数据库中,我使用了datetime,因此日期分别存储为
2014-01-08 00:00:00
2014-01-10 00:00:00

如果您是一个用户,并且今天是结束日期,那么您将假定截止日期是午夜。但是,情况并非如此,因为小时、分钟和秒设置为0

我想问一下,添加小时、分钟和秒的最佳方式是什么,这样结束日期可以一直到午夜

另外,我使用的是Java Sql数据

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

startDate和endDate是
java.sql.date
类型

存在
java.sql.date
的全部原因是它不允许时分秒(由ANSI sql日期类型定义,并且几乎被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);

java.sql.Date
存在的全部原因是它不允许小时分钟和秒(由ANSI sql日期类型定义,并且几乎被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);

这是时间戳数据类型的代码

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数据库中的示例

这是时间戳数据类型的代码

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数据库中的示例,如前所述,存储为2013-01-10 00:00:00的日期将转换为2013-01-10 23:59:59.999,然后将其作为结束日期

MySql

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

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()));
现在,您还可以与这个
日历
对象进行比较


希望这有帮助。

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

MySql

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

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()));
现在,您还可以与这个
日历
对象进行比较

希望这能有所帮助。

没有所谓的“一天的结束” 你的问题和所有答案的问题是一天结束的定义。你无法确定一天的结束,因为在一天的最后一秒和新的一天的第一刻之间有无限的几分之一秒

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

使用新的一天 表示时间跨度的正确方法是记录:

  • 跨度开始的时刻
  • 跨后力矩
您缺少第二项的“之后”部分

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

所讨论的时刻是否大于或等于开始时刻
是否小于停止时刻

请注意,它的第二部分不包含
或等于
。现在,您可以计算从一天的最后一秒到新一天的第一刻之间的所有分数

为了举例说明,下面是一个如何定义一周的图表。这是从另一个问题

=第1天开始)和(<第8天开始)“>

乔达时间 在Java工作中,避免使用Java.util.Date和Calendar类,而是使用Java 8中新的Java.time.*类(受Joda time启发)

第一刻 不要假设新的一天从00:00:00开始。有些时区从午夜钟声开始,将时钟指针移动到01:00左右。Joda time包含一种方法,用于确定新的一天的第一个时刻:。该方法很聪明,处理异常,例如从午夜开始的DST。午夜Joda Time中的d方法已被弃用或不再推荐

DateTime tomorrow = new DateTime().plusDays( 1 ).withTimeAtStartOfDay();
时区 实际上,更好的做法是总是指定一个时区,而不是依赖默认值

DateTime tomorrow = new DateTime( DateTimeZone.forId( "Europe/Paris" ) ).plusDays( 1 ).withTimeAtStartOfDay();
或者,如果使用/GMT(无时区偏移)

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

来回

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