SQL дата и время вычисление - PullRequest
2 голосов
/ 07 сентября 2011

У меня есть эти поля в моей базе данных T-SQL - startTime и endTime и processTime.
Время процесса - это количество времени от начала до конца.
Итак, один startTimeНапример, 22:50:59 и его endTime: 23:14:23.
Время обработки будет равно .39 (текущий код):

SELECT convert( decimal(18,0), totalItems 
        /(datediff(ss,sessionStartTime,sessionEndTime)/60.00/60.00) ) 
  AS processTime

Похоже, что это работает по большей части, но это не такне работает, когда startTime и endTime охватывают день, например, startTime составляет 23:17:27, а endTime - 00:31:23.

Другими словами, они начались в 22:17 и закончились примерно в 12:31 следующего утра, но SQL этого не видит, потому что processTime отображается как отрицательное число (-22.77) ...
Как преобразовать эти отрицательные времена в положительные?

У меня есть отдельные поля даты - startDate и endDate.

Ответы [ 3 ]

1 голос
/ 07 сентября 2011

Я предполагаю, что вы работаете в MS SQL и по какой-то причине вы убираете компонент даты, чтобы дата всегда была одинаковой. Это можно исправить, проверив дату, и если время окончания меньше, чем время начала, добавьте день ко времени окончания.

SELECT CONVERT(DECIMAL(18, 0), totalitems / 
     ( CASE 
             WHEN sessionendtime < sessionstarttime THEN Datediff(ss, sessionstarttime, Dateadd(dd, 1, 
       sessionendtime )) 
            ELSE Datediff(ss, sessionstarttime, sessionendtime ) 
       END)/ 
       60.00/60.00)

Это решение проблематично, если время окончания превышает 24 часа после времени начала

1 голос
/ 07 сентября 2011

Во-первых, о каком движке базы данных мы говорим? MS SQL Server? MySQL? Что-то еще?

Я в основном работаю с MS SQL Server и не знаю реализации datediff других механизмов баз данных, но ваша проблема, вероятно, возникает из-за того, что ваши поля startTime и endTime содержат только информацию о времени, но не содержат дату:

Если вы даете datediff только 23:17:27 и 00:31:23, как он должен "решить" / "узнать", имеете ли вы в виду тот же день?
Но если бы вы установили startTime на 2011-09-06 23:17:27 и endTime на 2011-09-07 00:31:23, это сработало бы, потому что datediff определенно знал бы, что endTime не в тот же день, что и startTime.

0 голосов
/ 07 сентября 2011

Я предполагаю, что вы включаете даты ... (?)

Вот пример, который я запустил - похоже, работает как ожидалось:

declare @start datetime
declare @end datetime

set @start = '2011-09-06 23:17:27'
set @end = '2011-09-07 00:31:23'

select 
    datediff(second,@start,@end) as seconds, 
    datediff(minute,@start,@end) as minutes,
    datediff(hour,@start,@end) as hours,
    datediff(day,@start,@end) as days,
    datediff(month,@start,@end) as months,
    datediff(year,@start,@end) as years

Вот результаты:

seconds     minutes     hours       days        months      years
----------- ----------- ----------- ----------- ----------- -----------
4436        74          1           1           0           0

(1 row(s) affected)

Одна вещь, которую вы можете сделать, это перепроверить объем вашего десятичного преобразования.Например: это приводит к разным результатам, в зависимости от того, куда вы положили символы перед разделением:

declare @start datetime
declare @end datetime

set @start = '2011-09-06 23:17:27'
set @end = '2011-09-07 00:31:23'

select convert(decimal(18,0), (datediff(ss,@start,@end)))/60.00/60.00 as NEW_processTime,
       convert(decimal(18,0), (datediff(ss,@start,@end)/60.00/60.00)) as ORIGINAL_processTime

Вот результаты этого:

NEW_processTime                         ORIGINAL_processTime
--------------------------------------- ---------------------------------------
1.23222221666                           1

(1 row(s) affected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...