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

Откуда: Москва
Сообщений: 2646
В таблице хранятся две даты (начало, окончание)
SELECT DATEDIFF(MI,'2012-07-21 20:32:50','2012-07-22 14:13:48')


ALTER FUNCTION [dbo].[f_time_to_string] (@minutes int)
RETURNS varchar(255)
AS
BEGIN
    DECLARE 
        @days   int,
        @hours  int,
        @result varchar(255)
    
    SET @result = '.'
    IF @minutes < 0 SET @result = '-'
    SET @minutes = ABS(@minutes)
    
    SET @days = @minutes / (24 * 60)
    SET @minutes = @minutes - @days * 24 * 60
    SET @hours = @minutes / 60
    SET @minutes = @minutes - @hours * 60
    
    SET @result = @result + CAST(@days AS varchar(255)) + ' дн.'
    SET @result = @result + RIGHT('00' + CAST(@hours AS varchar(2)), 2) + ':' 
    SET @result = @result + RIGHT('0' + CAST(@minutes AS varchar(2)), 2)
    RETURN @result
END

GO
SELECT dbo.f_time_to_string(75)

Результат должен быть в виде
.0 дн.01:15

Сейчас вычисляется разница между датами в минутах и храниться в отдельном столбе.
Может передавать в функцию сразу две даты? Как оптимизировать функцию (ms sql 2005) ?
24 июл 12, 11:42    [12907272]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1310
trew,

SELECT cast(0 as datetime) + cast('2012-07-21 03:00:00' as datetime) - cast('2012-07-22 01:05:00' as datetime)


дальше сможите?
24 июл 12, 12:03    [12907476]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1310
trew,

первое слагаемое для примера что бы показать как на самом деле храняться даты и как лего они превращаются в числа с целой и дробной частью.
24 июл 12, 12:04    [12907484]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1310
SELECT cast(cast(cast('2012-07-21 03:00:00' as datetime) as float) - cast(cast('2012-07-22 01:05:00' as datetime) as float) as datetime)
24 июл 12, 12:06    [12907507]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
NIIIK,
Как Ваше решение привести к тому виду, который указан выше?

У меня получилось примерно тоже самое.
DECLARE @date_begin smalldatetime
DECLARE @date_end smalldatetime

SET @date_begin='20120719 12:33.20'
SET @date_end=  '20120721 15:55.20'

DECLARE @date_b1 int
DECLARE @date_e1 int
DECLARE @date_df int

SELECT @date_b1 = datediff(MI,(0),@date_begin )
SELECT @date_e1 = datediff(MI,(0),@date_end )
SELECT @date_df = datediff(MI,(0),@date_end ) -datediff(MI,(0),@date_begin )

--SELECT @date_e1 - @date_b1 as Itog          -- всего минут, разница между датами
--,(@date_e1 - @date_b1)/1440 as d            -- 60*24 (дней)
--,((@date_e1 - @date_b1)% 1440)/60 as h      -- часов
--,(@date_e1 - @date_b1) - 1440*((@date_e1 - @date_b1)/1440)  
--			- 60*(((@date_e1 - @date_b1)% 1440)/60) as m      -- мин


SELECT @date_df as Itog        -- всего минут, разница между датами
,@date_df/1440 as d            -- 60*24 (дней)
,(@date_df % 1440)/60 as h      -- часов
,@date_df - 1440*(@date_df/1440)  
			- 60*((@date_df  % 1440)/60) as m       -- мин
24 июл 12, 13:08    [12907936]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1310
trew,

А где у вас возникли сложности?
24 июл 12, 13:25    [12908034]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
DECLARE @D1 DATETIME;
DECLARE @D2 DATETIME;
SET @D1='2012-07-21 20:32:50';
SET @D2='2012-07-22 14:13:48';
SELECT STR(s/3600/24)+' дней '+REPLACE(STR(s/3600%24,2)+':'+STR(s/60%60,2)+':'+STR(s%60,2),' ','0')
FROM(SELECT DATEDIFF(SECOND,@D1,@D2))T(s);
по мотивам Как преобразовать ХХХ секунд в дни-часы-минуты-секунды?
И поиск: https://www.sql.ru/forum/actualsearch.aspx?search=%253600&sin=0&bid=1&a=&ma=0&dt=-1&s=1&so=1
24 июл 12, 13:28    [12908049]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1310
iap,

Да ну, то по-моему сложнее...

Лучше так

declare @firstDate datetime = '2012-07-21 02:00:00',
        @lastDate datetime = '2012-07-22 01:01:07';


select --compute cout of days
       datediff(day, @firstDate, @lastDate) 
       +
       case
        when cast(@lastDate as time) < cast(@firstDate as time)
        then -1
        else 0
       end as cntDays,
       
       --Compute time inteval
       cast(@lastDate - @firstDate as time) as timeInterval

(в интоге к строкам преобразовать для конкатенации всё равно надо.
но думаю будет работать шустрее и делать computedColumn если это надо для польшог количества значений хранимых в таблицые (и две даты сохраенены в таблице).
24 июл 12, 13:38    [12908127]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
iap,
Спасибо, на ms sql 2005 работает. Протестирую функцию для большой таблицы.
Постараюсь, активней пользоваться поиском, в следующий раз.

NIIIK
Мне нужно было решение не для 2008 :)
24 июл 12, 14:30    [12908504]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
trew
NIIIK
Мне нужно было решение не для 2008 :)
Там для 2008-го только инициализация при объявлении.
Легко переделать на раздельные объявления и присвоения.
Это безотносительно к качеству предложенного решения... :))
24 июл 12, 14:35    [12908548]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1310
NIIIK
Мне нужно было решение не для 2008 :)


declare @firstDate datetime = '2012-07-21 02:00:00';

select dateadd(day, -cast(@firstDate as int), @firstDate) m1,
       @firstDate - cast(@firstDate as int) as m2,
       dateadd(day, -datediff(day, 0, @firstDate), @firstDate) m3


Этих методов хватит?
24 июл 12, 17:01    [12909772]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
NIIIK
NIIIK
Мне нужно было решение не для 2008 :)


declare @firstDate datetime = '2012-07-21 02:00:00';

select dateadd(day, -cast(@firstDate as int), @firstDate) m1,
       @firstDate - cast(@firstDate as int) as m2,
       dateadd(day, -datediff(day, 0, @firstDate), @firstDate) m3


Этих методов хватит?
Опять для SQL2008, коллега?
24 июл 12, 17:12    [12909856]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
iap
NIIIK
пропущено...


declare @firstDate datetime = '2012-07-21 02:00:00';

select dateadd(day, -cast(@firstDate as int), @firstDate) m1,
       @firstDate - cast(@firstDate as int) as m2,
       dateadd(day, -datediff(day, 0, @firstDate), @firstDate) m3


Этих методов хватит?
Опять для SQL2008, коллега?
А! Я тип TIME не заметил
24 июл 12, 17:13    [12909863]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
NIIIK,

declare @firstDate datetime 
set @firstDate ='2012-07-21 02:50:00';
select dateadd(day, -cast(@firstDate as int), '20120722 03:45:00') m1


Хватит :)
Дни, часы, минуты, из этого форамата, ковырять substing() далее. Понятно, спасибо.
24 июл 12, 17:19    [12909919]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1310
iap
А! Я тип TIME не заметил

не суть важно...
принцип показывался с пониманием что из себя дата представляет. Эту задачу можно решить вообще неиспользуя функции даты при желании.
24 июл 12, 19:31    [12910509]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса, функции (работа с датами) ms sql 2005  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1310
trew,

внимательнее

declare @firstDate datetime 
set @firstDate ='2012-07-21 02:50:00';
select dateadd(day, -cast(@firstDate as int), @firstDate) m1
24 июл 12, 19:38    [12910531]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить