使用 Java/EJB 2.x 在 Oracle 上按日期(1916 年 5 月 1 日)查询记录
我有一个 EJB 2.1 实体 bean,它查询 Oracle 表中的“出生日期”列。数据库中的列的类型为 DATE。除了一个特定日期:1916 年 5 月 1 日之外,该查询工作正常。
这与夏令时有关。 Oracle 将日期存储为:5/1/1916 1:00:00 AM,而所有其他日期的时间设置为 12:00:00 AM(例如 1/7/1971 12:00:00 AM)。
在生产/接受系统上,1916 年 5 月 1 日的查询(使用 EJB-QL!)不会返回任何结果。奇怪的是它确实适用于我的开发/测试系统。我检查了各个系统上的数据库设置,发现 DBTIMEZONE 参数在开发/测试盒上设置为 +00:00,在生产/接受盒上设置为 +02:00。然而,将时区更改为 +02:00 不会产生任何差异。
什么可能导致这种行为?如何查询这个出生日期?
I have an EJB 2.1 entity bean that queries a "date of birth" column in an Oracle table. The column in the database is of type DATE. The query works without problems except for one specific date: 01 may 1916.
This has something to do with daylight savings. Oracle stores the date as: 5/1/1916 1:00:00 AM, while the time of all other dates is set to 12:00:00 AM (e.g. 1/7/1971 12:00:00 AM).
On the production/acceptation systems a query (with EJB-QL!) for 01 may 1916 return no results. The strange thing is that it does work on my development/test system. I've checked the database settings on the various systems and found the DBTIMEZONE parameter was set to +00:00 on the dev/test boxes and to +02:00 on the production/acceptation boxes. However changing the timezone to +02:00 yields no difference.
What could cause this behavior? How to search for this date of birth?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
只是一个大胆的猜测:您在比利时,并且日期被错误地写入数据库,因此稍后更改时区设置在查询时不会产生任何影响?
在比利时和其他一些欧洲国家,夏令时于 1916 年 5 月 1 日引入,跳过了从中午 12 点到凌晨 1 点的时间段,因此 5 月 1 日凌晨 12:00 实际上并不存在。如果数据库由 Java 软件填充,我会假设 Java 程序已经将 1AM 写入数据库。如果您跳过 Java 组件并使用 SQL 客户端在列中插入和查询“无时间”值(例如 to_date('1916-05-01', 'YYYY-MM-DD')),会发生什么?
Just a wild guess: You are in Belgium and the date was written incorrectly to the database, so that changing the timezone settings later, won't make any difference when querying?
In Belgium and a few other European countries, DST was introduced on May 1st 1916 by skipping the period from 12AM to 1AM, so May 1st, 12:00AM did in fact not exist. If the database is populated by Java software, I would assume that the Java program already wrote 1AM to the database. What happens if you skip the Java component and use an SQL client to insert and query a "time-less" value to/from the column, e.g. to_date('1916-05-01', 'YYYY-MM-DD')?