Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 время в минутах : секундах  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Добрый день, есть запрос, возвращает... ну, скажем, штук 20 колонок, в 10 из которых - какое-то время в секундах. 5 секунд, 128 секунд и т.п. Нужно сделать так, чтобы все эти 10 значений отображались в формате минуты:секунды, причем для обозначения минут и секунд использовалось не менее 2 знаков. Т.е., чтобы 5 секунд отображались, как 00:05, 123456 секунд - как 2057:36 и т.п.

Тупой вариант
select
  cast(a/60 as varchar) + ':' + cast(a%60 as varchar),
  cast(b/60 as varchar) + ':' + cast(b%60 as varchar),
  cast(c/60 as varchar) + ':' + cast(c%60 as varchar),
  ....
не проходит, так как 5 отображается, как 0:5, а не 00:05. Можно написать так
declare @date datetime
set @date=0
select
  convert(varchar,dateadd(ss,a,@date),108),
  convert(varchar,dateadd(ss,b,@date),108),
  convert(varchar,dateadd(ss,c,@date),108),
  ....
, это будет терпимо, но, все же, не то, что хотелось, плюс, метод достижения результата напоминает доставание правого уха левой рукой из-за спины. Можно использовать outer apply, произвести для каждого столбца каждой строки [любые] достаточно сложные вычисления - однако запрос получится громоздким и некрасивым. Наконец, можно плюнуть на производительность, написать и использовать функцию, преобразующую int в строку любого формата - но, разумеется, терять производительность не хочется.

Можно ли решить подобную задачу красиво? "Одним движением"? Может быть, есть приспособа?
29 янв 12, 00:10    [11990340]     Ответить | Цитировать Сообщить модератору
 Re: время в минутах : секундах  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
select
  replace(case when a/60 < 100 then str(a/60, 2) else cast(a/60 as varchar) end + ':' + str(a%60, 2), ' ', '0')
29 янв 12, 02:01    [11990623]     Ответить | Цитировать Сообщить модератору
 Re: время в минутах : секундах  [new]
Коляныч
Member

Откуда:
Сообщений: 279
Shlippenbaranus,

Вообще имхо SQL сервер не должен заниматься отображательством, это задача клиента. Вернуть ему просто int и пусть в каком хочет формате эти секунды у себя рисует.
29 янв 12, 08:10    [11990852]     Ответить | Цитировать Сообщить модератору
 Re: время в минутах : секундах  [new]
aleks2
Guest
declare @a int
set @a=61

select REPLACE(STR(@a/60,2) + ':' + STR(@a%60,2), N' ', N'0') 
29 янв 12, 09:26    [11990865]     Ответить | Цитировать Сообщить модератору
 Re: время в минутах : секундах  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
aleks2, для больших @a будет переполнение в первой конвертации в строку.
29 янв 12, 13:00    [11991158]     Ответить | Цитировать Сообщить модератору
 Re: время в минутах : секундах  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Спасибо откликнувшимся!

invm, aleks2, kDnZP:

да, действительно, str + replace помогают. Без них у меня получалось длиннее:
select
  a.a, c.a, a.b, c.b
from (
  ... основной запрос ... 
  )a(...a,b...)
outer apply (
  select
    case when a1<10 then '0' else '' end + cast(a1 as varchar) + ':' + case when a2<10 then '0' else '' end + cast(a2 as varchar),
    case when b1<10 then '0' else '' end + cast(b1 as varchar) + ':' + case when b2<10 then '0' else '' end + cast(b2 as varchar),
    ...
  from 
    (select a/60,a%60,b/60,b%60...) c (a1,a2,b1,b2...)
  )c(a,b...)

Хотя действий, в моем варианте, выполняется меньше, в три раза :).

Коляныч,

согласен, в платоновском мире SQL сервер не должен заниматься отображательством, это задача клиента. Но мы-то копошимся в реальном. Плюс, в платоновском мире и сам SQL сервер был бы малость другим :):):).
31 янв 12, 18:19    [12006552]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить