我有一个我需要定期运行的查询,它会从日志表中提取错误x天。我最初使用 - <<。
在下面突出显示了x天数的语法脚本提取我想要的信息,不会抛出任何错误,但它会从所有日期中提取项目,而不仅仅是我正在寻找的X天。无论我在...,getdate())
之前放置什么价值,它都会提取所有记录。
任何想法如何让它正确地给我从我今天寻找的日期范围?
SELECT
t2.[campaignshortname],
t1.[CampaignId],
t1.[CreatedDtTm],
t1.[Msg],
t1.[ReferenceDate]
FROM
[alchemy].[CM].[CampaignLog] AS t1 (nolock)
INNER JOIN
[alchemy].[CM].[Campaign] AS t2 ON t1.CampaignId = t2.Id
WHERE
CAST(t1.[ReferenceDate] AS DATE) <= dateadd(DAY, -30, getdate()) --<<
AND t1.Msg LIKE '%fail%' OR t1.Msg LIKE '%error%'
ORDER BY
ReferenceDate DESC
答案 0 :(得分:0)
您需要将t1.Msg like '%fail%' or t1.Msg like '%error%'
括在括号中,因为and
在执行顺序中位于or
之前。因此,您的条件在您的表中搜索第一行,其中日期是当前日期之前30天或更长时间,并且消息包含单词&#34; fail&#34;,然后它在您的表中搜索消息包含的行字#34;错误&#34;。你的情况应该是:
where CAST(t1.[ReferenceDate] AS DATE) <= dateadd(DAY, -30,getdate())
and (t1.Msg like '%fail%' or t1.Msg like '%error%')
答案 1 :(得分:0)
我实际上会更多地更改查询并在以下之间使用:
where convert(datetime, t1.[ReferenceDate]) between getdate()-30 and getdate()
and (t1.Msg like '%fail%' or t1.Msg like '%error%')
虽然喜欢的人会对索引或表格进行全面扫描,除非你对它进行子查询。