美好的一天!
我的SQL日期有问题。我认为主要问题是从时间的角度来看。
在我的计划中,我有一个开始和结束日期,例如2014-01-08
和2014-01-10
。
在日期库中,我使用了datetime,因此日期分别存储为2014-01-08 00:00:00
和2014-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
种类型
答案 0 :(得分:3)
如上所述,存储为2013-01-10 00:00:00的日期将转换为2013-01-10 23:59:59.999,然后将其作为结束日期。
<强> MySQL的强>
当您查询日期时间字段时,您可以按如下方式将结束时间提前一天
DATE_ADD('your_datetime_field', INTERVAL 1 DAY)
OR
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
对象进行比较。
希望这有帮助。
答案 1 :(得分:2)
您的问题和所有答案的问题是一天结束的定义。你不能确定一天的结束,因为在一天的最后一秒和新一天的第一个时刻之间有无限的一秒钟。
你可能认为你可以弥补这一点。一个答案谈到java.sql.Date消除分钟和秒,这是真的 - 但你可能需要时间作为你的价值观的一部分。另一个答案谈到使用几分之一秒的三个小数位。但是不同的数据库会保存不同数量的小数位,因此您构建的是一个脆弱的假设。 Java 8中的新java.time。*类使用纳秒时间分辨率,这意味着您的应用程序可能具有表示在您的三位小数限制之后发生的时刻的实例。
表示时间跨度的正确方法是记录:
您错过了第二项的“之后”部分。
停止时间,即您的截止日期,应该是新一天的第一时刻。在到期/截止日期之前的有效期包括在新的一天之前发生的所有无限精细时刻。通过将停止点标记为新的一天,您可以编写应用程序的逻辑。查询为......
有问题的时刻GREATER THAN OR EQUAL
到开始AND
是LESS THAN
停止吗?
请注意,第二部分不包含OR EQUAL TO
。现在你要计算在最后一天和新一天的第一个时刻之间的所有分数。
为了说明,这是一个如何定义一周的图表。这是从my answer转到另一个问题Get the week start and end date given a current date and week start。
在Java工作中,避免使用java.util.Date&amp;日历类。而是在Java 8中使用Joda-Time或新的java.time。*类(受Joda-Time启发)。
不要假设新的一天从00:00:00开始。有些时区在午夜时分开始Daylight Saving Time (DST),将时钟的指针移动到01:00。 Joda-Time包含了一种确定新一天第一时刻的方法:withTimeAtStartOfDay
。这种方法很聪明,从午夜开始处理DST等异常现象。 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构造函数。另一方面,在Joda-Time中调用toDate()
方法。
要...
DateTime myDateTime = new DateTime ( myDate );
来回......
java.util.Date myDate = myDateTime.toDate();
答案 2 :(得分:0)
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);
答案 3 :(得分:0)
这是时间戳数据类型
的代码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数据库中的示例