2014-11-20 2 views
0

У меня есть работа sql, которая запрашивает базу данных. Задача должна запускаться каждые 24 часа, и она отправляет электронное письмо с требуемыми данными с диапазоном запросов от 07:30 сегодня до 07:30 предыдущего дня. Вот код для заголовка моей электронной почты:SQL - диапазон запросов электронной почты

INSERT INTO @ReportContentBuilder VALUES('<h4>Query Range : ' + DATENAME(WEEKDAY,@StartTimestamp) 
      + ', ' + CONVERT(varchar, @StartTimestamp, 106) + ' ' + CONVERT(varchar, @StartTimestamp, 108) 
      + ' (UTC) to ' + DATENAME(WEEKDAY,@EndTimestamp) + ', ' + CONVERT(varchar, @EndTimestamp, 106) 
      + ' ' + CONVERT(varchar, @EndTimestamp, 108) + ' (UTC)</h4>') 

Здесь значение я для @StartTimestamp:

SET @StartTimestamp = CAST((CONVERT(varchar(11), DATEADD(DAY, -1, @EndTimestamp), 106) + ' 07:30') as datetime) 

Вот ожидаемый выход на мой электронный заголовок:

Диапазон запросов: среда, 19 ноября 2014 г. 07:30:00 (UTC) по четверг, 20 ноября 2014 г. 07:30:00 (UTC)

Мой вопрос: какое значение у меня se для @EndTimestamp ??

Если я использую GETUTCDATE(), а задание выполняется через 2 минуты, то диапазон неверен. Я также не хочу жестко кодировать его из-за изменений, необходимых для дневного сбережения каждый раз.

ответ

1

Фокус в том, что «динамическая» часть - это разница между текущим временем (GETUTCDATE()) и 7:30. Таким образом, с @timeDiff вы можете справиться с этой динамической частью процесса. Попробуйте это (замените последний выбор на нужную вставку, я только проверил выход):

DECLARE @StartTimestamp datetime 
DECLARE @EndTimestamp datetime = GETUTCDATE() 

DECLARE @timeDiff time 

SET @timeDiff = CONVERT(time, (@EndTimestamp - cast('1900-01-01 07:30:00.000' as datetime))) 

SELECT @EndTimestamp = dateadd(second, 
       datepart(hour,@timeDiff) * -3600 + 
       datepart(minute,@timeDiff) * -60 + 
       datepart(second,@timeDiff) * -1, 
       @EndTimestamp) 

SET @StartTimestamp = DATEADD(DAY, -1, @EndTimestamp) 

SELECT @StartTimestamp, @EndTimestamp 

SELECT '<h4>Query Range : ' + DATENAME(WEEKDAY,@StartTimestamp) 
     + ', ' + CONVERT(varchar, @StartTimestamp, 106) + ' ' + CONVERT(varchar, @StartTimestamp, 108) 
     + ' (UTC) to ' + DATENAME(WEEKDAY,@EndTimestamp) + ', ' + CONVERT(varchar, @EndTimestamp, 106) 
     + ' ' + CONVERT(varchar, @EndTimestamp, 108) + ' (UTC)</h4>' 
Смежные вопросы