如何将时间戳舍入为天数?

How to Round up timestamp to number of Days?

PreparedStatement psnmt=con.prepareStatement("SELECT (?)-(?) as DiffDate FROM dual");
psnmt.setTimestamp(1,ctenderdate);
psnmt.setTimestamp(2,btenderdate);
ResultSet resrt=psnmt.executeQuery();
if(!resrt.next())
{
     out.println("No Records Found");
}
else
{
  do
     {
        datediff=resrt.getString("DiffDate");
     }
  while(resrt.next()); 
  System.out.println("the no of days Difference"+datediff);
              
}

ctenderdate=2015-06-27 00:00:00.0

btenderdate=2015-06-29 00:00:00.0

datediff=1 10:18:51.940000000

Expected datediff=2

如何将 datediff 四舍五入为天数

查看 this link。在数小时或数分钟内就有结果的答案。你要找的应该是相似的。

我的错。我不应该post只是-link-答案。你可以做什么,正如所描述的那样:

SELECT TRUNC (SYSDATE) - TO_DATE ('10/20/2012', 'mm/dd/yyyy') FROM DUAL;

注意以下细节:

ENDDATE - STARTDATE will give you a number that corresponds to the number of days between the two dates.

If you want the result in hours, multiply by 24; if minutes, multiply by 24*60 and so forth.

You can also convert the result to an INTERVAL. There are two type of intervals: NUMTODSINTERVAL(ENDDATE - STARTDATE, 'DAY') or NUMTOYMINTERVAL(ENDDATE - STARTDATE, 'DAY')

编辑

减去 TIMESTAMP 值

如果我们真的想减去两个 TIMESTAMP 值,那么我们必须使用 returned 的 INTERVAL DAY TO SECOND 数据类型。最简单的方法是使用 EXTRACT 函数。

如果想要 return 整数天数(模拟 CEIL 函数)那么我们可以测试是否有任何部分时间 (HOUR, MINUTE, SECOND) 是非零的。如果它们都为零,我们可以只使用 DAY 部分。否则,我们必须在 DAY 部分加 1,并且 return 那。

例如:

  SELECT EXTRACT(DAY FROM diff.idts) 
         + CASE 
             WHEN EXTRACT(HOUR   FROM diff.idts) > 0 
               OR EXTRACT(MINUTE FROM diff.idts) > 0
               OR EXTRACT(SECOND FROM diff.idts) > 0
             THEN 1
             ELSE 0
           END
         AS days_diff
    FROM ( SELECT ? - ? AS idts FROM dual ) diff

原始答案

对于Oracle数据库,您可以在数据库中执行此操作:

SELECT CEIL(TO_DATE(?,'YYYY-MM-DD HH24:MI:SS.F')-TO_DATE(?,'YYYY-MM-DD HH24:MI:SS.F'))
  FROM dual 

这假定绑定参数作为字符串传递,格式与 TO_DATE 函数中指定的格式模型相匹配,例如:

  '2015-06-27 14:45:21.0'

(我假设是 Oracle,因为使用了 dual table,并且因为您在两个日期之间使用减法运算。您需要针对不同的数据库使用不同的语句。 )

稍微解开那个表达式...

Oracle TO_DATE 函数将字符串转换为 Oracle DATE 值。第二个参数是格式模型,指定第一个参数的格式。

两个 DATE 值之间的减法运算 return 天数之差(整数天加上小数天)。

CEIL 函数将非整数值四舍五入为下一个更大的整数。

跟进

问:如何使用时间戳?

A: 两个 TIMESTAMP 值的减法得到 returned 作为 INTERVAL DAY TO SECOND 数据类型。我宁愿避免使用它。

在 Oracle 中,当我们对两个 DATE 值进行减法时,我们得到一个十进制数。这更容易使用。

就 "rounding" 天数差异而言,我可以忽略小数秒。

如果我必须传入 TIMESTAMP 个值,我会将它们转换为 DATE 个值。上面的表达式已经在期待字符串值,所以我只是将 ? 替换为

 TO_CHAR(?,'YYYY-MM-DD HH24:MI:SS')

如果我需要传递 TIMESTAMP 数据类型,并且 return 整数天差四舍五入,我会使用这样的查询:

 SELECT CEIL( TO_DATE(TO_CHAR( ? ,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS')
            - TO_DATE(TO_CHAR( ? ,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS')
        ) AS days_diff
  FROM dual