Извлечение день / час / минута - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть следующий код, который работает, однако как мне получить терминальные минуты, чтобы показать результат в виде дня, часа, минуты?Если это невозможно, возможно ли добавить +1 к времени, которое указывало бы на следующий день?

Проблема, с которой я сталкиваюсь, заключается в том, что когда наши заказы выполняются после 23.59 вечера, система неотображение правильного формата из-за 24-часового периода времени.

enter image description here Я в замешательстве и надеюсь, что не путаю вопросы.

SELECT FOLIO_NUMBER, TERMINAL_NAME,
  format((START_LOAD_TIME - ORDER_ENTRY_TIME), 'HH:mm') AS STAGING_MINUTES, 
  format((TERM_END_LOAD_TIME - START_LOAD_TIME), 'HH:mm') AS LOADING_MINUTES,
  format((TERM_END_LOAD_TIME - ORDER_ENTRY_TIME), 'HH:mm') AS TERMINAL_MINUTES 
FROM ORDERS  
JOIN TERMINAL_OWNER ON ORDERS.LOADING_TERMINAL_ID = TERMINAL_OWNER.TERMINAL_ID

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019
DECLARE @INT INT

SET @INT = DATEDIFF(SECOND,GETDATE(),GETDATE()+1)

select 
convert(varchar(10), (@INT/86400)) + ':' + 
convert(varchar(10), ((@INT%86400)/3600)) + ':'+
convert(varchar(10), (((@INT%86400)%3600)/60)) + ':'+
convert(varchar(10), (((@INT%86400)%3600)%60)) as 'DD:HH:MM:SS'

Предоставлено Nat-MS.Смотри здесь

0 голосов
/ 05 февраля 2019

Я бы сказал, что вы должны устранить необходимость указывать дни / часы в выходных данных SQL и просто получить разницу в минутах, с которой вы затем сможете работать на уровне приложения.

Take этот пример кода :

create table #orders (
    FOLIO_NUMBER int,
    START_LOAD_TIME datetime,
    ORDER_ENTRY_TIME datetime,
    TERM_END_LOAD_TIME datetime
)

insert into #orders (FOLIO_NUMBER,START_LOAD_TIME,ORDER_ENTRY_TIME,TERM_END_LOAD_TIME)
values (1, getdate(),getdate() - 1,getdate() + 1)

select *, 
    datediff(mi, ORDER_ENTRY_TIME, START_LOAD_TIME) AS STAGING_MINUTES,
    datediff(mi, START_LOAD_TIME, TERM_END_LOAD_TIME) AS LOADING_MINUTES,
    datediff(mi, ORDER_ENTRY_TIME, TERM_END_LOAD_TIME) AS TERMINAL_MINUTES
from #orders

drop table #orders

Это выведет разницу в минутах между событиями:

FOLIO_NUMBER    STAGING_MINUTES LOADING_MINUTES TERMINAL_MINUTES
1               1440            1440            2880

Затем вы можете выполнить несколько простых математических операций с этими значениями для извлечения, дней,часы и минуты.

0 голосов
/ 05 февраля 2019

Я думаю, вы ищете что-то вроде этого

Declare @theMinutes Varchar(10)
Set @theMinutes = '19:25' 

declare @totMintute int
Select    
  @totMintute = (Cast(
  Cast(left(@theMinutes,charindex(':',@theMinutes)-1) as Int) * 60
  + Cast(substring(@theMinutes,charindex(',',@theMinutes)+4,len(@theMinutes)) as Int)  
as Int ) * 60) / 60

--For 12 hour 1 days
Select @totMintute / 720 as NoDays  -- 720 minutes per day 
       , (@totMintute % 720) / 60 as NoHours -- modulo 720 
       , (@totMintute % 60) as NoMinutes -- modulo 60

--For 24 hour 1 days
Select @totMintute / 1440 as NoDays  -- 1440 minutes per day 
       , (@totMintute % 1440) / 60 as NoHours -- modulo 1440 
       , (@totMintute % 60) as NoMinutes -- modulo 60

Результат будет выглядеть так, как показано ниже.

enter image description here

Вы можете преобразовать эту таблицу источника данных запроса, как показано ниже.

Create table #Temp (MinValue Varchar(8))
insert into #Temp Values ('19:25')

Select TotMinute / 720 as NoDays  -- 1440 minutes per day 
       , (TotMinute % 720) / 60 as NoHours -- modulo 1440 
       , (TotMinute % 60) as NoMinutes -- modulo 60
from(
select 
(Cast(
  Cast(left(MinValue,charindex(':',MinValue)-1) as Int) * 60
  + Cast(substring(MinValue,charindex(',',MinValue)+4,len(MinValue)) as Int)
as Int ) * 60) / 60  as TotMinute
from #Temp
)a

Вы можете найти живую демонстрацию здесь .

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