有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何显示时间戳之间超过24小时的时间差

我有一个返回响应速度的查询。除timediff计算结果超过24小时的情况外,它正常工作。我得到一个错误“java.sql.SQLException:java.sal.Time-type-in-value的小时值'31'非法”

“31”的数量随时间戳之间小时数的变化而变化

我不知道该从这里开始。我尝试了timestampdiff(),但在尝试运行查询时出错

如有任何意见或建议,将不胜感激

SELECT a.*
FROM
(SELECT
databunker.purchases.id                                           AS 'pur_id',
 databunker.purchases.business                                    AS 'pur_business',
 databunker.purchases.time                                        AS 'pur_time',
 databunker.customers.id                                          AS 'customer_id',
 databunker.customers.phone_number                                AS 'customer_phone_#',
 databunker.customers.is_primary                                  AS 'customer_is_primary',
 map.object_salesforce_id,
 databunker.five9_calls.campaign_name,
 databunker.five9_calls.start_timestamp AS 'start_of_call',
 TIMEDIFF(databunker.five9_calls.start_timestamp, databunker.purchases.time) AS 'speed_to_response'

FROM databunker.purchases
 LEFT OUTER JOIN databunker.customers ON (databunker.purchases.customer_id = databunker.customers.id)
 LEFT OUTER JOIN (SELECT
                    databunker.mappings.object_salesforce_id,
                    databunker.mappings.object_id AS 'map_customer_id'
                  FROM databunker.mappings
                  WHERE databunker.mappings.object_class = 'customer') AS map
   ON (databunker.purchases.customer_id = map.map_customer_id)
 LEFT OUTER JOIN databunker.five9_calls ON (map.object_salesforce_id = 
databunker.five9_calls.salesforce_id)
WHERE databunker.purchases.business = 'uma'
     AND databunker.purchases.outcome_type = 'accepted'
     AND databunker.purchases.time >= curdate() - 1

     AND databunker.five9_calls.start_timestamp >= databunker.purchases.time

GROUP BY
 databunker.purchases.id,
 databunker.purchases.business,
 databunker.purchases.time,
 databunker.customers.id,
 databunker.customers.phone_number,
 map.object_salesforce_id,
 databunker.five9_calls.campaign_name,
 databunker.five9_calls.start_timestamp,
 TIMEDIFF(databunker.five9_calls.start_timestamp, databunker.purchases.time)

 ORDER BY databunker.purchases.id, databunker.purchases.time, 
 databunker.five9_calls.start_timestamp ASC) a

INNER JOIN

(
SELECT
  databunker.purchases.id AS 'pur_id_2',
  MIN(databunker.five9_calls.start_timestamp) AS 'call_time'


FROM databunker.purchases
  LEFT OUTER JOIN databunker.customers ON (databunker.purchases.customer_id = databunker.customers.id)
  LEFT OUTER JOIN (SELECT
                     databunker.mappings.object_salesforce_id,
                     databunker.mappings.object_id AS 'map_customer_id'
                   FROM databunker.mappings
                   WHERE databunker.mappings.object_class = 'customer') AS map
    ON (databunker.purchases.customer_id = map.map_customer_id)
  LEFT OUTER JOIN databunker.five9_calls ON (map.object_salesforce_id = databunker.five9_calls.salesforce_id)
WHERE databunker.purchases.business = 'uma'
      AND databunker.purchases.outcome_type = 'accepted'
      AND databunker.purchases.time >= curdate() - 1

      AND databunker.five9_calls.start_timestamp >= databunker.purchases.time

GROUP BY
  databunker.purchases.id
) b

ON a.pur_id = b.pur_id_2 AND a.start_of_call = b.call_time

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    有“一天中的时间”和“时间跨度”

    MySQL的TIMEDIFF()返回31小时的“时间跨度”,等等

    Java代码预期的是“一天中的时间”,当然,该时间不应超过23:59:59(忽略闰秒)

    一个解决办法是

    TO_SECONDS(databunker.five9_calls.start_timestamp) -
    TO_SECONDS(databunker.purchases.time)
    

    但这不会再出现(例如)“31:58:47”;相反,它将给出“115127”

    另一个解决方法是避免java.sal.Time,并找到一个处理“时间跨度”的库