我有一个查询数据库的sql作业。该作业计划每24小时运行一次,它会发送一封包含所需数据的电子邮件,其查询范围从今天的07:30到前一天的07:30。以下是我的电子邮件标题的代码:
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)
以下是我的电子邮件标题的预期输出:
查询范围:2014年11月19日星期三07:30:00(UTC)至2014年11月20日星期四07:30:00(UTC)
我的问题是我对@EndTimestamp使用什么价值?
如果我使用GETUTCDATE()并且作业晚了2分钟,则范围不正确。由于每次夏令时所需的更改,我也不想对其进行硬编码。
答案 0 :(得分:1)
诀窍是&#34;动态&#34; part是当前时间(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>'