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

Откуда:
Сообщений: 125
Добрый день!
Возвращаясь к теме времени https://www.sql.ru/forum/1256533/srednee-vremya-resheniya

Получилось так,что разница даты закрытия и открытия может быть больше 24 часов.
В связи с этим использовать такой запрос неправильно.
Select Name,
Convert(VARCHAR,CAST(AVG(CAST(CAST(CLOSE_TIME as datetime) - CAST(OPEN_TIME  as datetime)as float)) as datetime), 108)as TM
From Time


для того,чтобы вывести и дни,месяцы,годы, немного изменила вывод с 108 на 120,

Select Name,
Convert(VARCHAR,CAST(AVG(CAST(CAST(CLOSE_TIME as datetime) - CAST(OPEN_TIME  as datetime)as float)) as datetime), 108)as TM
From Time


Результат 1900-02-04 00-12-05, что не совсем корректно
Необходимо получить вывод 0000-02-04 00-12-05, т.е. без 1900 года.


Затем мне подсказали использовать
AVG(DATEDIFF(MI? OPEN_TIME, CLOSE_TIME)) as TM

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


Можете предложить альтернативу,которая выполняла бы необходимое условие? Год без 1900

Спасибо!
13 апр 17, 06:59    [20396621]     Ответить | Цитировать Сообщить модератору
 Re: Ограниченный Convert  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Marin_1a,

Вы ж это в ssrs выводить, задайте формат там как уже говорили
13 апр 17, 07:16    [20396630]     Ответить | Цитировать Сообщить модератору
 Re: Ограниченный Convert  [new]
Marin_1a
Member

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

через DATEDIFF ?
13 апр 17, 07:19    [20396636]     Ответить | Цитировать Сообщить модератору
 Re: Ограниченный Convert  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Marin_1a,

я в него не смотрю уже пару лет, но гугл отдаёт =Format(Now(), "dd hh:mm tt")
13 апр 17, 09:20    [20396919]     Ответить | Цитировать Сообщить модератору
 Re: Ограниченный Convert  [new]
aleks2
Guest
Marin_1a
Добрый день!
Возвращаясь к теме времени https://www.sql.ru/forum/1256533/srednee-vremya-resheniya

Получилось так,что разница даты закрытия и открытия может быть больше 24 часов.
В связи с этим использовать такой запрос неправильно.
Select Name,
Convert(VARCHAR,CAST(AVG(CAST(CAST(CLOSE_TIME as datetime) - CAST(OPEN_TIME  as datetime)as float)) as datetime), 108)as TM
From Time


для того,чтобы вывести и дни,месяцы,годы, немного изменила вывод с 108 на 120,

Select Name,
Convert(VARCHAR,CAST(AVG(CAST(CAST(CLOSE_TIME as datetime) - CAST(OPEN_TIME  as datetime)as float)) as datetime), 108)as TM
From Time


Результат 1900-02-04 00-12-05, что не совсем корректно
Необходимо получить вывод 0000-02-04 00-12-05, т.е. без 1900 года.


Затем мне подсказали использовать
AVG(DATEDIFF(MI? OPEN_TIME, CLOSE_TIME)) as TM

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


Можете предложить альтернативу,которая выполняла бы необходимое условие? Год без 1900

Спасибо!


Осподе, за что ты посылаешь управдомов в программирование?

1. Даты - это даты. А не интервалы.
2. Определитесь с точностью и РУЧКАМИ

select Years = datediff( year, OPEN_TIME, CLOSE_TIME)
       , Month = datediff( month, OPEN_TIME, dateadd( year, -datediff( year, OPEN_TIME, CLOSE_TIME), CLOSE_TIME)
       , Days = datediff( days, OPEN_TIME, dateadd(mohth, -datediff( month, OPEN_TIME, dateadd( year, -datediff( year, OPEN_TIME, CLOSE_TIME), CLOSE_TIME), dateadd( year, -datediff( year, OPEN_TIME, CLOSE_TIME), CLOSE_TIME) )
...


3. При некоторой сообразительности - можно записать "покороче"
13 апр 17, 09:38    [20396976]     Ответить | Цитировать Сообщить модератору
 Re: Ограниченный Convert  [new]
aleks2
Guest
-- Description:	Разница между датами в Годах, Месяцах, Днях, Часах, Минутах, Секундах.
-- =============================================
/*
  select * from [dbo].[DateDiff](getdate() - 1200, getdate())
*/
ALTER FUNCTION [dbo].[DateDiff] 
(	
	@Date1 datetime, 
	@Date2 datetime = null
)
RETURNS TABLE 
AS
RETURN 
( with dts as ( select Date1 = @Date1, Date2 = isnull( @Date2, getdate() ) )
   , y0 as ( select x = datediff( year, Date1, Date2), * from dts )
   , y as  ( select Years = iif( dateadd( year, -x, Date2) >= Date1, x, x - 1), Date1, Date2 from y0 )
   , m0 as ( select Years, x = datediff( month, Date1, dateadd( year, -Years, Date2) ), Date1, Date2 = dateadd( year, -Years, Date2) from y )
   , m as  ( select Years, Months = iif( dateadd( month, -x, Date2) >= Date1, x, x - 1), Date1, Date2 from m0 )
   , d0 as ( select Years, Months, x = datediff( day, Date1, dateadd( month, -Months, Date2) ), Date1, Date2 = dateadd( month, -Months, Date2) from m )
   , d as  ( select Years, Months, Days = iif( dateadd( day, -x, Date2) >= Date1, x, x - 1), Date1, Date2 from d0 )
   , h0 as ( select Years, Months, Days, x = datediff( hour, Date1, dateadd( day, -Days, Date2) ), Date1, Date2 = dateadd( day, -Days, Date2) from d )
   , h as  ( select Years, Months, Days, Hours = iif( dateadd( day, -x, Date2) >= Date1, x, x - 1), Date1, Date2 from h0 )
   , mi0 as ( select Years, Months, Days, Hours, x = datediff( minute, Date1, dateadd( hour, -Hours, Date2) ), Date1, Date2 = dateadd( hour, -Hours, Date2) from h )
   , mi as  ( select Years, Months, Days, Hours, Minutes = iif( dateadd( hour, -x, Date2) >= Date1, x, x - 1), Date1, Date2 from mi0 )
   , s0 as ( select Years, Months, Days, Hours, Minutes, Seconds = datediff( second, Date1, dateadd( minute, -Minutes, Date2) ), Date1, Date2 = dateadd( minute, -Minutes, Date2) from mi )
   --, s as ( select Years, Months, Days, Hours, Minutes, Seconds = iif( dateadd( minute, -x, Date2) >= Date1, x, x - 1), Date1, Date2 from s0 )

select * from s0
)
13 апр 17, 10:20    [20397196]     Ответить | Цитировать Сообщить модератору
 Re: Ограниченный Convert  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1832
Marin_1a
Результат 1900-02-04 00-12-05, что не совсем корректно
Необходимо получить вывод 0000-02-04 00-12-05, т.е. без 1900 года.

https://msdn.microsoft.com/ru-ru/library/ms182418.aspx - Диапазон даты От 01.01.1900 до 06.06.2079
https://msdn.microsoft.com/ru-ru/library/bb677335.aspx - Диапазон даты От 0001-01-01 до 31.12.99
Как бы вы ни хотели а дату преобразовать в строку, где год будет 0000 нельзя. Это же дата, а не накопление времени.

Marin_1a
AVG(DATEDIFF(MI? OPEN_TIME, CLOSE_TIME)) as TM
Только представьте какой получился ответ в минутах,где разница в несколько месяцев....

select datediff(second, '19500101', '20000101') - 50 лет и всего 1577836800

Вообще форматированием результата должен заниматься клиент, но если вы мазохист, то как-то так:
+
declare
  @A datetime = '19000204 00:12:05'

;with t1 as
(
  select
    cast(convert(varchar, cast(@A as date), 112) as int) as d1,
    replace(convert(varchar, cast(@A as time), 108), ':', '') as t1
),
t2 as
(
  select
    RIGHT('00000000' + cast(tmp.d1 - (year(cast(0 as datetime)) * 10000) as varchar), 8) + tmp.t1 as dt
  from
    t1 as tmp
),
t3 as
(
  select
    substring(tmp.dt, 1, 4) as y,
    substring(tmp.dt, 5, 2) as m,
    substring(tmp.dt, 7, 2) as d,
    substring(tmp.dt, 9, 2) as h,
    substring(tmp.dt, 11, 2) as mi,
    substring(tmp.dt, 13, 2) as s
  from
    t2 as tmp
)
  select
    CONCAT(tmp.y, '-', tmp.m, '-', tmp.d, ' ', tmp.h, '-', tmp.mi, '-', tmp.s)
  from
    t3 as tmp

представьте дату в виде целого числа, как mssql хранит ее в msdb.dbo.sysschedules и работайте как с целым числом применяя математические операции
14 апр 17, 02:03    [20400935]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить