如何将时间戳汇总到天数?

时间:2015-06-27 08:49:47

标签: sql date datediff

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

     

预期日期= 2

如何将日期替换为天数

2 个答案:

答案 0 :(得分:1)

修改

减去TIMESTAMP值

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

如果想要返回整数天数(模拟CEIL函数),那么我们可以测试是否有任何部分时间(HOURMINUTESECOND)非零。如果它们都为零,我们只能使用DAY部分。否则,我们必须在DAY部分添加1,然后返回。

例如:

  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'

(由于使用了dual表,因为你在两个日期之间使用减法运算,所以我假设是Oracle。你需要为不同的数据库使用不同的语句。)

要解压缩那个表达式......

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

两个DATE值之间的减法运算会将差值作为天数(整数天加上小数天)返回。

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

<强>后续

问:如何将它与时间戳一起使用?

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

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

就&#34;舍入&#34;而言如果天数不同,我可以忽略小数秒。

如果我必须传递TIMESTAMP值,我会将它们转换为DATE值。上面的表达式已经预期了字符串值,因此我只需将 ? 替换为

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

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

 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 

答案 1 :(得分:0)

结帐this link。有几小时或几分钟的结果答案。你在寻找什么应该是相似的。

我的坏。我不应该只发布一个链接答案。你能做什么,如下所述:

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

请注意以下详细信息:

  

ENDDATE - STARTDATE会给你一个与之对应的数字   这两个日期之间的天数。

     

如果您想要以小时为单位的结果,请乘以24;如果分钟,乘以   到24 * 60等等。

     

您还可以将结果转换为INTERVAL。有两种类型   间隔:NUMTODSINTERVAL(ENDDATE - STARTDATE,'DAY')或   NUMTOYMINTERVAL(ENDDATE - STARTDATE,'DAY')