2013-02-13 3 views
5

Могу ли воспользоваться помощью гуру на этом. Пытаясь вычислить время между двумя значениями даты и времени показывают, как в запросе T-SQL ...T-SQL форматирование расчетной колонки как время

SELECT arrivalDate - departDate AS timeToComplete 

Это всегда должно быть меньше, чем 24 часа. Но кто знает, что пользователь может ввести?

Я пробовал что-то подобное без каких-либо попыток.

SELECT 
    CAST(time(7), 
    CONVERT(datetime, arrivalDate - departDate) AS timeToComplete) AS newTime, 

Вместо того чтобы показывать результаты как 1:23:41 в качестве примера, есть способ, чтобы показать результаты, как:

0D, 1H, 23M, 33S. 

Спасибо за каких-либо указаний по этому вопросу.

+0

вы также можете посмотреть мой обновленный пример, который достигнет вашего требования в инструкции select. –

ответ

2

Просто по-другому :) Попробуйте использовать этот подход:

объявлять @ DATE1 DateTime; declare @ date2 datetime;

set @date1 = '2012-05-01 12:00:000' 
set @date2 = '2012-05-01 18:00:000' 


    SELECT 
    STUFF(
     STUFF(
      STUFF(
       RIGHT(CONVERT(NVARCHAR(19), CONVERT(DATETIME, DATEADD(second, DATEDIFF(S, @date1, @date2), '20000101')), 120), 11), 
       3, 1, 'D, '), 
      8, 1, 'H, '), 
     13, 1, 'M, ') + ' S'; 
+0

Я не уверен, что понимаю, что вы пытаетесь передать здесь. Сначала есть несколько отсутствующих скобок, и я хотел бы использовать их в инструкции SELECT. – htm11h

+0

Возможно, вы сделали ошибку при копировании запроса, я успешно выполнил этот запрос. К сожалению, sqlfiddle не доступен для меня сейчас, и я не могу поделиться с вами вопросом. –

+0

@roman Почему sqlfiddle недоступен для вас? Что-то не так с сайтом? –

4

Вы можете получить полную разницу в секундах, а затем сохранить большую часть из этого. I.e., начните с Дней, затем часов, минут и секунд.

DECLARE @arrivalDate DATETIME = '2013-01-19 23:59:59' 
DECLARE @departDate DATETIME = '2013-01-25 11:52:30' 

DECLARE @SecondsDifference INT = DATEDIFF(SECOND, @arrivalDate, @departDate) 

DECLARE @DayDifference INT = @SecondsDifference/86400 
DECLARE @HourDifference INT = (@SecondsDifference - (@DayDifference * 86400))/3600 
DECLARE @MinDifference INT = (@SecondsDifference - (@DayDifference * 86400) - (@HourDifference * 3600))/60 
DECLARE @SecDifference INT = (@SecondsDifference - (@DayDifference * 86400) - (@HourDifference * 3600) - (@MinDifference * 60)) 

Я сделал это здесь, используя переменные для ясности, но вы можете работать в одном запросе. DATEDIFF не будет работать для меньших фрагментов разницы, пока вы не удалите более крупные, потому что вы получите итоговые значения. Например:

DATEDIFF(HOUR, @arrivalDate, @departDate) 

будет возвращать общее количество часов, а не часы меньше в течение всего дня.

+0

Ничего себе, это может быть сложно скомпилировать, но я думаю, что он, вероятно, справится с моей проблемой лучше всего. Попытка сделать это в элементе управления SQL Datasource. Спасибо – htm11h

+0

Может быть целесообразно включить его в функцию, которая возвращает либо полностью отформатированную строку (например, «0D, 12H, 30M, 25S»), либо возвращает набор данных с целыми днями, часами, минутами, секундами. Таким образом, вы можете называть его встроенным в свой источник данных. – Bill

+0

Я разместил обновление со ссылкой на решение, которое, похоже, работает очень хорошо. еще раз спасибо, – htm11h

1

Наконец нашел отличное решение по этой ссылке, SQL - Seconds to Day, Hour, Minute, Second спасибо за помощь, хотя люди, это заставило меня дальше в этом вопросе и поиска нужной информации.

Смежные вопросы