Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
NIIIK Member Откуда: Россия, Ростовская область, г. Таганрог Сообщений: 1295 |
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] Ответить | Цитировать Сообщить модератору |
NIIIK Member Откуда: Россия, Ростовская область, г. Таганрог Сообщений: 1295 |
trew, первое слагаемое для примера что бы показать как на самом деле храняться даты и как лего они превращаются в числа с целой и дробной частью. |
24 июл 12, 12:04 [12907484] Ответить | Цитировать Сообщить модератору |
NIIIK Member Откуда: Россия, Ростовская область, г. Таганрог Сообщений: 1295 |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
NIIIK Member Откуда: Россия, Ростовская область, г. Таганрог Сообщений: 1295 |
trew, А где у вас возникли сложности? |
24 июл 12, 13:25 [12908034] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
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] Ответить | Цитировать Сообщить модератору |
NIIIK Member Откуда: Россия, Ростовская область, г. Таганрог Сообщений: 1295 |
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] Ответить | Цитировать Сообщить модератору |
trew Member Откуда: Москва Сообщений: 2646 |
iap, Спасибо, на ms sql 2005 работает. Протестирую функцию для большой таблицы. Постараюсь, активней пользоваться поиском, в следующий раз. NIIIK Мне нужно было решение не для 2008 :) |
24 июл 12, 14:30 [12908504] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
Легко переделать на раздельные объявления и присвоения. Это безотносительно к качеству предложенного решения... :)) |
||
24 июл 12, 14:35 [12908548] Ответить | Цитировать Сообщить модератору |
NIIIK Member Откуда: Россия, Ростовская область, г. Таганрог Сообщений: 1295 |
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] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
![]() |
||||
24 июл 12, 17:12 [12909856] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
|
||||
24 июл 12, 17:13 [12909863] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
NIIIK Member Откуда: Россия, Ростовская область, г. Таганрог Сообщений: 1295 |
не суть важно... принцип показывался с пониманием что из себя дата представляет. Эту задачу можно решить вообще неиспользуя функции даты при желании. |
||
24 июл 12, 19:31 [12910509] Ответить | Цитировать Сообщить модератору |
NIIIK Member Откуда: Россия, Ростовская область, г. Таганрог Сообщений: 1295 |
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 | ![]() |