我有一个非常简单的SSIS包。它针对SQL Server数据库运行。开始时间设置为DATEADD(hh,-6,GETDATE())并拉取记录,进行2次简单数据转换并将它们放在另一个SQL表中。
预定每6小时(凌晨1点,早上7点,下午1点和晚上7点)运行。它每次都有效 - 除非是晚上7点。晚上7点,它不返回任何数据,也没有错误。如果我将日期硬编码为晚上7点,它会毫无问题地运行并正确填充数据。
我已经尝试过我能想到的一切 - 我已经删除了这项工作并重新创建了它,我已经安排它专门运行4次,我已经预定了它每6小时运行一次。我很难过。
任何人对我的问题可能有什么想法?
编辑: 这是代码。但是当我把时间放在晚上7点时它起作用,并且它每隔一段时间就有效。
SELECT AlarmDetail.Priority, Comment.Comment, AlarmDetail.EventStamp, AlarmMaster.GroupName
FROM AlarmDetail
INNER JOIN Comment ON Comment.CommentId = AlarmDetail.CommentId
INNER JOIN AlarmMaster ON AlarmMaster.AlarmId = AlarmDetail.AlarmId
WHERE
AlarmDetail.EventStamp > DATEADD(hh,-6,GETDATE())
AND AlarmDetail.EventStamp < dateadd(hour,13,DATEDIFF(d,0,getdate()))
AND AlarmDetail.AlarmState = 'UNACK_ALM'
AND AlarmDetail.Priority <= 3
答案 0 :(得分:1)
我认为查询错了。如果您执行此代码:
select DATEADD(hh,-6,cast('2016-06-10 19:00:00' as datetime)), dateadd(hour,13,DATEDIFF(d,0,cast('2016-06-10 19:00:00' as datetime)))
<强>输出强>
2016-06-10 13:00:00.000 2016-06-10 13:00:00.000
这种情况总会给你一个空洞的结果:
AlarmDetail.EventStamp > DATEADD(hh,-6,GETDATE())
AND AlarmDetail.EventStamp < dateadd(hour,13,DATEDIFF(d,0,getdate()))
答案 1 :(得分:0)
您在查询条件中使用了6小时的跨度,并且您每6小时运行一次该作业。由于您不提供样本数据和查询,因此只能推测: - 您需要检查WHERE标准,并重新考虑毫秒很重要的事实。
答案 2 :(得分:0)
WHERE AlarmDetail.EventStamp > DATEADD(hh,-6,GETDATE())
AND AlarmDetail.EventStamp < dateadd(hour,13,DATEDIFF(d,0,getdate()))
你意识到这一点,“EventStamp是在六小时前和今天下午一点之后的地方。”
晚上7点之前的六个小时是下午1点,所以如果你在晚上7点运行它,你会在下午1点之前和下午1点之后找到EventStamps。如果它在晚上7点之后运行,它将永远不会返回任何东西。
您还需要注意DATEADD(hh,-6,GETDATE())
仍然有一个包含分钟和秒的时间组件,并且没有时间安排程序是完全精确的。如果您在下午1:00:38运行它,您将在7:00:38 AM之后获得活动。如果您上次运行任务,则会在上午7:00:05执行,然后您缺少33秒的事件。同样,如果后续运行时间是07:00:10 PM,您将捕获28秒的事件两次。显然,我不知道你需要它,但是如果你期望总是只捕获一次事件,那么这个查询并不能保证。