Внедрить запрос и подзапрос в представление SQL (разное время в часах и мин.) - PullRequest
2 голосов
/ 16 июня 2011

Я хочу показать пользователю, как давно эта запись была добавлена.(Например, «0 дней 5 часов 6 минут»), поэтому мне нужно взять общее количество мин.и сделать математику.Я сделал это в C #, но теперь мне нужно сделать это в синтаксисе SQL, есть ли простой способ сделать это?

ОБНОВЛЕНИЕ: Благодаря ответу @Andomar здесь я получил его на работукак отдельный запрос, теперь мне нужно добавить его к большому представлению таблицы вызовов ..

 select case when days > 0 then CAST(Days as varchar(6)) +  ' Days ' else +  
        case when hours > 1 and hours < 24 then cast(hours as varchar(6)) + ' hours'
         when hours > 1 and hours < 24  then '1 hour'
         else '' 
    end + ' ' +
    case when minutes > 1 and minutes < 60 then cast(minutes as varchar(6)) + ' minutes'
         when minutes = 1 then '1 min.'
         else '' 
    end 
    end as TimeOpen
    From   (
    select  datediff(HH, dbo.Calls.CallDate, getdate()) as hours
    ,       datediff(MI, dbo.Calls.CallDate,getdate()) % 60 as minutes
    ,       datediff(D, dbo.Calls.CallDate, getdate()) as Days
    from    calls where Status <> 7 and Status <> 4
    ) as SubQuery

Ответы [ 4 ]

2 голосов
/ 20 июня 2011

Поместите ваши вычисления даты в пользовательскую функцию.Примерно так.

create function GetDateDiffStr(@FromDate datetime, @ToDate datetime) returns varchar(50)
as
begin
  declare @Ret varchar(50)
  select @Ret = 
         cast(DayDiff.Value as varchar(10))+case DayDiff.Value when 1 then ' day ' else ' days ' end+
         cast(HourDiff.Value as varchar(10))+case HourDiff.Value when 1 then ' hour ' else ' hours ' end+
         cast(MinutDiff.Value as varchar(10))+case MinutDiff.Value when 1 then ' minute ' else ' minutes ' end
  from        (select datediff(mi, @FromDate, @ToDate)) as TotalMinutes(Value)
  cross apply (select TotalMinutes.Value / (24*60)) as DayDiff(Value)
  cross apply (select (TotalMinutes.Value - DayDiff.Value*24*60)/60) as HourDiff(Value)
  cross apply (select TotalMinutes.Value - DayDiff.Value*24*60 - HourDiff.Value*60) as MinutDiff(Value)
  return @Ret
end

И используйте функцию в списке полей в вашем представлении.

select dbo.GetDateDiffStr(YourDateColumn, getdate()) as DateDiffStr
from YourTable
2 голосов
/ 16 июня 2011

Вы можете найти разницу в часах, например:

datediff(hour, startdate, enddate)

И остаток минут:

datediff(minutes, startdate, enddate) % 60

В совокупности это будет выглядеть так:

select  cast(datediff(hour, startdate, enddate) as varchar(20)) + ' hours ' + 
        cast(datediff(minutes, startdate, enddate) % 60 as varchar(20) + ' min.'

Чтобы сделать условное форматирование, вы можете использовать подзапрос:

select  case when hours > 1 then cast(hours as varchar(6)) + ' hours'
             when hours > 1 then '1 hour'
             else '' 
        end + ' ' +
        case when minutes > 1 then cast(minutes as varchar(6)) + ' minutes'
             when minutes = 1 then '1 minute'
             else '0 minutes'
        end
from    (
        select  datediff(hour, startdate, enddate) as hours
        ,       datediff(minutes, startdate, enddate) % 60 as minutes
        from    YourTable
        ) as SubQueryAlias

Я оставлю добавление дней в качестве упражнения для читателя;)

1 голос
/ 21 июня 2011
CREATE VIEW <i>your_view_name</i>
AS
WITH
  ViewWithMinutes AS (
    SELECT
      TotalMinutes = DATEDIFF(mi, <i>start_date_column</i>, GETDATE()),
      <i>other_columns</i>
    FROM <i>your_tables_and_joins</i>
  ),
  ViewWithTimeParts AS (
    SELECT
      Minutes = TotalMinutes % 60,
      Hours   = TotalMinutes / 60 % 24,
      Days    = TotalMinutes / 60 / 24,
      <i>the_other_columns</i>
    FROM
  )
SELECT
  TimeOpen = CAST(Days    AS varchar) + CASE Days    WHEN 1 THEN ' day '    ELSE ' days '    END
           + CAST(Hours   AS varchar) + CASE Hours   WHEN 1 THEN ' hour '   ELSE ' hours '   END
           + CAST(Minutes AS varchar) + CASE Minutes WHEN 1 THEN ' minute ' ELSE ' minutes ' END
  <i>the_other_columns</i>
FROM ViewWithTimeParts
1 голос
/ 16 июня 2011

Вам нужно будет указать, с какой системой баз данных вы работаете, но в SQL Server (и я предполагаю, что многие другие системы баз данных) вы можете создать функцию , которая имеет ту же логику, что и вашав вашем коде, а затем вы можете назвать это в запросе SQL

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