SQL - X天内数据的语法提取所有数据

时间:2015-09-28 17:04:19

标签: sql sql-server tsql

我有一个我需要定期运行的查询,它会从日志表中提取错误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

2 个答案:

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

虽然喜欢的人会对索引或表格进行全面扫描,除非你对它进行子查询。