从Duration到seconds的转换不正确

时间:2017-11-06 13:08:41

标签: sql date time teradata

我的SQL代码提供了错误的转换 -

代码 -

SELECT 
 ,begins as "START_TIME"
   , ends as "END_TIME"
   , (ends-begins) DAY(4) TO SECOND  as "Duration"
    ,EXTRACT(DAY  FROM Duration) * 86400 + EXTRACT(HOUR   FROM Duration) * 3600  + EXTRACT(MINUTE FROM Duration) * 60  + EXTRACT(SECOND FROM Duration) as "Duration_in_sec"
FROM
TABLE_NAME

输出 -

+-----------------+-----------------+-------------------+-----------------+
|   START_TIME    |    END_TIME     |     Duration      | Duration_in_sec |
+-----------------+-----------------+-------------------+-----------------+
| 9/20/2017 6:11  | 9/20/2017 13:45 | 0 07:33:05.000000 |         113,585 |
| 8/21/2017 10:58 | 8/28/2017 6:13  | 6 19:14:49.000000 |         674,089 |
| 9/20/2017 6:11  | 9/20/2017 11:45 | 0 05:34:14.000000 |         106,454 |
| 7/17/2017 0:57  | 7/17/2017 3:00  | 0 02:03:12.000000 |          93,792 |
| 7/23/2017 21:41 | 7/24/2017 2:41  | 0 04:59:28.000000 |         104,368 |
| 12/3/2016 15:20 | 12/4/2016 15:20 | 1 00:00:03.000000 |         172,803 |
| 8/24/2017 19:42 | 8/24/2017 20:30 | 0 00:48:27.000000 |          89,307 |
| 8/29/2017 23:07 | 8/30/2017 6:00  | 0 06:53:14.000000 |         111,194 |
+-----------------+-----------------+-------------------+-----------------+

但我清楚地知道第一记录7:33:05(7小时33分钟和5秒)= 27 185秒而不是113,585

我怀疑我的逻辑错误但不确定在哪里。

编辑 - 使用

  

EXTRACT(从持续时间开始)* 3600 + EXTRACT(从持续时间开始)   * 60 + EXTRACT(来自持续时间的第二个)为“Duration_in_sec”

而不是

  

提取(持续时间为一天)* 86400 +提取(从持续时间开始)*   3600 +提取(持续时间为分钟)* 60 +提取(第二次来自   持续时间)为“Duration_in_sec”

适用于值<24小时。

这似乎是提取功能中的一个错误。

PS - 我的总体目标是将持续时间列除以 int 列。为了做到这一点,我将持续时间转换为秒。如果有任何其他方式划分。请告诉我。

2 个答案:

答案 0 :(得分:0)

找到答案 -

即使当天为0,系统也会返回1.

例如,对于(0 07:33:05.000000)

EXTRACT(DAY FROM Duration)-1
即使天数为0,

也将返回1而不是0.因此,所有计算都添加了84600秒(不确定原因)。

所以我只是将逻辑改为

if(preg_match_all('/(\n|\s)+@[,\-_]*(\w+([,\-_]\w+)?)/', $content, $match)) {
    foreach($match[2] as $usr) {
        -code here-
    }
}

答案 1 :(得分:0)

试试,

 SELECT  CONVERT(VARCHAR, DATEDIFF(dd, @start, @end)) + ' Days '
    + CONVERT(VARCHAR, DATEDIFF(hh, @start, @end) % 24) + ' Hours '
    + CONVERT(VARCHAR, DATEDIFF(mi, @start, @end) % 60) + ' Minutes '
    + CONVERT(VARCHAR, DATEPART(ss, DATEADD(s, @x, CONVERT(DATETIME2, '0001-
     01-01')))) + ' Seconds'

乘以86400秒和小时乘以3600分钟和60分钟,得到所有的总和。