美好的一天!
我对 SQL 日期有疑问。我认为主要问题是在时间的角度上。
在我的程序中,我有一个开始和结束日期,例如 2014-01-08
和 2014-01-10
。
在数据库中,我使用了日期时间,因此日期分别存储为 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 消除分钟和秒,这是真的 - 但你可能需要时间作为你的值(value)观的一部分。另一个答案谈到使用几分之一秒的小数点后三位。但是不同的数据库保存不同数量的小数位,所以你在建立一个脆弱的假设。 Java 8 中新的 java.time.* 类使用纳秒级时间分辨率,这意味着您的应用程序可能具有表示小数点后三位数限制后发生的时刻的实例。
使用新的一天
表示时间跨度的正确方法是记录:
- 跨度开始的时刻
- 跨度结束之后的时刻
您错过了第二项的“之后”部分。
停止时间,你的情况下的截止日期,应该是新一天的第一时刻。有效期限,在到期/截止日期之前,包括直到新的一天发生的所有无限美好的时刻。通过将停止点标记为新的一天,您可以将应用和查询的逻辑编写为……
GREATER THAN OR EQUAL
到 Start AND
的时刻是 LESS THAN
Stop 吗?
请注意,第二部分不包含OR EQUAL TO
。现在,您要计算一天的最后一秒和新一天的第一刻之间的所有零点几秒。
为了说明,这里有一个如何定义一周的图表。这取自 my answer另一个问题,Get the week start and end date given a current date and week start .
乔达时间
在 Java 工作中,避免使用 java.util.Date 和 Calendar 类。而是使用 Joda-Time或 Java 8 中的新 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();
关于java - 将小时、分钟、秒添加到 SQL 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20988152/