【发布时间】:2010-06-23 09:14:57
【问题描述】:
以下问题困扰着我,我找不到任何合理的解释和解决方案。也许有人可以启发我。
我有一个计算日期差异(以天为单位)的应用程序 - 在搜索掩码和详细信息掩码中。在第一个掩码中,我使用 days 过滤出具有持续时间搜索条件(搜索掩码)的记录,并使用 SQL 查询来执行此操作:
WHERE...
...
AND DECODE(TRUNC(to_number(SUBSTR((close_date -
create_date),1,instr(close_date - create_date,' ')))), NULL,
TRUNC(to_number(SUBSTR((systimestamp - create_date),1,instr(systimestamp -
create_date,' ')))), TRUNC(to_number(SUBSTR((close_date -
create_date),1,instr(close_date - create_date,' ')))) ) >=140
AND DECODE(TRUNC(to_number(SUBSTR((close_date -
create_date),1,instr(close_date - create_date,' ')))), NULL,
TRUNC(to_number(SUBSTR((systimestamp - create_date),1,instr(systimestamp -
create_date,' ')))), TRUNC(to_number(SUBSTR((close_date -
create_date),1,instr(close_date - create_date,' ')))) ) <=140
在这种特殊情况下,我尝试找出所有持续时间为 140 天的记录。
在第二个掩码(详细信息)中,我显示了记录详细信息,包括其持续时间。这是通过以下 java 代码完成的:
public static Integer getDuration(Date caseDate, Date closeDate) {
Date beginDate = caseDate;
Date endDate = (closeDate != null)? closeDate: new Date();
long difference = endDate.getTime() - beginDate.getTime();
int daysDiff = (int) (difference / (24.0 * 60 * 60 * 1000));
return new Integer(daysDiff);
}
我的问题是,当我搜索时,我找到了一些符合搜索条件的记录。例如,我找到 4 条记录,所有记录的持续时间均为 140 天。这是甲骨文的说法。但是,当我为其中一些人打开详细信息蒙版时,我会得到 139 天的持续时间。所以不知何故,Java 和 Oracle 以不同的方式计算日期差异。似乎在 Oracle 中进行了一些舍入,但我找不到发生这种情况的地方。因此,任何建议都会有所帮助。谢谢!
您好, 历历在目
【问题讨论】:
-
在Oracle中没有更优雅的计算差异的方法吗?难道你不能完全按照你在 Java 中所做的:将日期相减吗?
-
这几乎是我认为最优雅的方式。当我减去时,我得到类似 140 0:0:0.0 或 140 10:13:15.54734 的结果。 substr-part 仅用于从结果中提取天数。
-
您能给我们举一个 Oracle 和 Java 评估不同的日期的例子吗?可能会帮助我们确定它。
-
create_date - 11.02.09 00:00:00,000000000 close_date - 01.07.09 00:00:00,000000000 系统时间戳 - 23.06.10 14:05:35,927570000 +02:00跨度>