如何将时间戳舍入为天数?
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
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