Преобразование установки продолжительности дня nvarchar в datetime - PullRequest
0 голосов
/ 26 февраля 2010

У меня есть функция SQL Server, которая преобразует значение nvarchar дня в значение datetime .

Формат продолжительности дня: > дни <.> Часы <:> минуты <</strong>, например 1,2: 00 для одного дня и двух часов.

Формат настройки продолжительности дня не может быть изменен, и мы можем быть уверены, что все данные правильно отформатированы и представлены.

Если для функции задать время начала и установить продолжительность дня, она должна возвращать время окончания.

Например: 2010-01-02 13:30 ==> 2010-01-03 2: 00

Я использую комбинацию методов charindex, substring и convert для вычисления значения, что-то вроде медленно и неловко. Есть ли другой способ напрямую преобразовать настройку продолжительности дня в значение datetime?

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

Не из того, что я вижу. Я бы в конечном итоге получил такой же SQL-код, как и вы, используя charindex и т. Д. К сожалению, это не тот формат, в котором хранится продолжительность дня. Я знаю, что вы не можете изменить его, но если бы он был в другом формате, он будет намного проще - например, как я обычно это делаю, это рационализировать продолжительность до базовой единицы, например, минут.

Вместо хранения 1.2: 00 в течение 1 дня и 2 часов, это будет (1 * 24 * 60) + (2 * 60) = 1560. Это может быть использовано в прямом DATEADD на исходную дату (дату) только часть).

С вашим форматом все подходы, которые я могу придумать, включают использование CHARINDEX и т. Д.

1 голос
/ 26 февраля 2010

Одной из альтернатив будет построение строки с вычислением. Затем вы можете запустить сгенерированный SQL с sp_executesql, указав @enddate в качестве выходного параметра:

declare @startdate datetime
declare @duration varchar(10)
declare @enddate datetime

set @startdate = '2010-01-02 13:30'
set @duration = '0.12:30'

declare @sql nvarchar(max)
set @sql = 'set @enddate = dateadd(mi,24*60*' + 
    replace(replace(@duration,'.','+60*'),':','+') + ', @startdate)'
exec sp_executesql  @sql,
    N'@startdate datetime, @enddate datetime out', 
    @startdate, @enddate out

Это создает строку, содержащую set @enddate = dateadd(mi,24*60*0+60*12+30, @startdate), а затем запускает ее.

Я сомневаюсь, что это быстрее, чем обычный charindex способ:

declare @pos_dot int
declare @day int
declare @hour int
declare @minute int

select 
    @pos_dot = charindex('.',@duration),
    @day = cast(left(@duration, @pos_dot-1) as int),
    @hour = cast(left(right(@duration, 5), 2) as int),
    @minute = cast(right(@duration, 2) as int),
    @enddate = dateadd(mi, 24*60*@day + 60*@hour + @minute, @startdate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...