SQL - 电子邮件查询范围

时间:2014-11-20 15:36:40

标签: sql sql-server-2008

我有一个查询数据库的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分钟,则范围不正确。由于每次夏令时所需的更改,我也不想对其进行硬编码。

1 个答案:

答案 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>'