![]() |
1
7
我们是这样做的。
忽略那些坚持认为两者之间在某种程度上对SQL的成功至关重要的抱怨者。
有了它,一系列的日期范围真的很容易审核。的数据库值
显示时,如果需要,可以显示已格式化的
|
![]() |
2
4
甲骨文拥有 TIMESTAMP datatype thread on asktom.oracle.com 关于日期算术。 |
![]() |
3
3
我赞同S.洛特的解释。我们有一个广泛使用日期时间范围的产品套件,这是我们从中吸取的教训之一。顺便说一下,我们称之为结束日期 独家 结束日期,如果它不再是范围的一部分(低,半开放间隔)。相比之下,它是一个 包含全部费用 结束日期,如果它是范围的一部分,只有在没有时间部分时才有意义。 用户通常期望输入/输出包含的日期范围。无论如何,请尽快将用户输入转换为独占的结束日期范围,并在必须向用户显示任何日期范围时尽可能晚地转换。 在数据库上,始终存储独占的结束日期范围。如果存在包含结束日期范围的旧数据,请尽可能在DB上迁移它们,或者在读取数据时尽快转换为独占结束日期范围。 |
![]() |
4
2
我使用Oracle的日期数据类型,并就影响边界条件的时间组件问题对开发人员进行培训。 数据库约束还将防止意外指定列中不应包含时间组件的时间组件,并告知优化器所有值都不包含时间组件。 例如,约束检查(MY_DATE=TRUNC(MY_DATE))防止将时间不是00:00:00的值放入MY_DATE列,还允许Oracle推断诸如MY_DATE=to_DATE('2008-09-12 15:00:00')之类的谓词永远不会为真,因此不会从表中返回任何行,因为它可以扩展为:
当然,这是自动错误的。 尽管有时很容易将日期存储为数字,如20080915,但这可能会导致查询优化问题。例如,在20071231和20070101之间有多少法律价值?在2007年12月31日和2008年1月1日之间呢?它还允许输入非法值,例如20070100。 因此,如果日期没有时间成分,那么定义范围就变得很容易:
当存在时间组件时,可以执行以下操作之一:
或
... 给出0.01875,而不是0.0187499999999或其他任何值。 |
![]() |
5
1
我还没有看到发布的间隔数据类型。 Oracle还为您的具体场景提供了数据类型。Oracle中也有从年到月的间隔数据类型和从天到秒的间隔数据类型。
|
![]() |
6
0
1) 将日期转换为历元整数(自1970年1月1日起的秒数),并将其作为整数存储在数据库中。 2) 将日期转换为YYYYMMDDHHMMSS整数,并将其作为整数存储在数据库中。 3) 将其存储为日期
我一直坚持使用1和2,因为它使您能够对日期执行快速而简单的算法,而不依赖于底层数据库功能。 |
![]() |
7
0
根据您的第一句话,您遇到了Java隐藏的“特性”(即bug)之一:
Joda time
,谷歌日历使用。如果你做不到这一点,我猜是一个由包装器组成的API
|
![]() |
8
0
getTime() 作为一个长整数。 在数据库查询中需要日、周、月等操作的情况下,当查询性能至关重要时,时间戳(标准化为比毫秒更高的粒度)可以链接到日期细分表,该表包含日、周、月的列,等值,以便在查询中不必使用昂贵的日期/时间函数。 |
![]() |
9
0
艾伦是对的——乔达时间很好。Date和Calendar只是一个遗憾。 如果需要时间戳,请使用带有时间的oracle日期类型,用某种后缀命名该列,如_tmst。将数据读入java时,将其读入joda time DateTime对象。要确保时区是正确的,可以考虑在Oracle中有特定的数据类型,它将用时区存储时间戳。或者,您可以在表中创建另一列来存储时区ID。时区ID的值应为时区的标准全名ID,请参阅 http://java.sun.com/j2se/1.4.2/docs/api/java/util/TimeZone.html#getTimeZone%28java.lang.String%29 . 如果对TZ dta使用另一列,则在将数据读入java时,请使用DateTime对象,但在DateTime对象上使用.withZoneRetainFields设置时区。 如果只需要日期数据(无时间戳),则在数据库中使用日期类型,而不使用时间。再说一次。在本例中,使用来自jodatime的DateMidnight对象。 底线:利用数据库的类型系统和您使用的语言。学习它们,并从使用表达性api和语言语法来处理问题中获益。 |
![]() |
10
0
更新:Joda Time项目现在处于维护模式。它的团队建议迁移到 java.time Java中内置的类。 Joda Time提供了3个类来表示时间跨度:间隔、持续时间和周期。 ISO 8601标准规定了如何格式化表示 Duration 和 Interval . Joda Time解析并生成这样的字符串。 时区是一个重要的考虑因素。数据库应以UTC格式存储其日期时间值。但是您的业务逻辑可能需要考虑时区。“一天”的开始取决于时区。顺便说一下,使用 proper time zone names 而不是3或4个字母的代码。 这个 correct answer by S.Lott 明智地建议使用半开放逻辑,因为这通常最适合日期时间工作。一段时间的开始是 包含全部费用 而结局是 独家
转储到控制台
跑步时
|
![]() |
11
-1
我以毫秒为单位存储所有日期。我根本不使用时间戳/日期时间字段。 所以,我必须把它当作长线来操纵。这意味着我在sql查询中不使用“before”、“after”、“now”关键字。 |
![]() |
krash · 获取日期范围的月末日期 7 年前 |
![]() |
woodbine · Postgresql重叠日期范围和求和结果 7 年前 |
![]() |
user908094 · 计算与重叠日期范围相关的值的总和 11 年前 |
![]() |
Phrogz · 左侧外部联接的作用与内部联接类似 11 年前 |