【问题标题】:SQL How to correctly set a date variable value and use it?SQL 如何正确设置日期变量值并使用它?
【发布时间】:2011-02-13 23:42:30
【问题描述】:

我有以下使用日期变量的查询,该变量是在存储过程中生成的:

DECLARE @sp_Date DATETIME
SET @sp_Date = DateAdd(m, -6, GETDATE())

SELECT DISTINCT pat.PublicationID
     FROM PubAdvTransData AS pat 
     INNER JOIN PubAdvertiser AS pa ON pat.AdvTransID = pa.AdvTransID
     WHERE (pat.LastAdDate > @sp_Date) AND (pa.AdvertiserID = 12345))

问题是@sp_Date 值似乎被忽略了,我想知道为什么?我是否定义或使用不正确?

【问题讨论】:

  • 你怎么知道它被忽略了?您是否在输出中看到 LastAdDate 早于 6 天前的行?
  • 忽略是什么意思?是不过滤还是什么?
  • 它正在提取超过 6 个月前的数据。弗朗西斯科·索托,是的,不过滤日期。

标签: sql sql-server date sql-server-2008


【解决方案1】:

您的语法很好,它将返回 LastAdDate 位于过去 6 个月内的行;

select cast('01-jan-1970' as datetime) as LastAdDate into #PubAdvTransData 
    union select GETDATE()
    union select NULL
    union select '01-feb-2010'

DECLARE @sp_Date DATETIME = DateAdd(m, -6, GETDATE())

SELECT * FROM #PubAdvTransData pat
     WHERE (pat.LastAdDate > @sp_Date)

>2010-02-01 00:00:00.000
>2010-04-29 21:12:29.920

你确定LastAdDate 的类型是DATETIME

【讨论】:

  • 其实你是对的,不是 DATETIME 是 smalldatetime,我已经解决了问题。
【解决方案2】:

如果您使用静态日期值(例如“2009-10-29 13:13:07.440”)手动写出查询,您会得到任何行吗?

所以,您是说以下两个查询会产生正确的结果:

SELECT DISTINCT pat.PublicationID
FROM PubAdvTransData AS pat 
    INNER JOIN PubAdvertiser AS pa 
        ON pat.AdvTransID = pa.AdvTransID
WHERE (pat.LastAdDate > '2009-10-29 13:13:07.440') AND (pa.AdvertiserID = 12345))

DECLARE @sp_Date DATETIME
SET @sp_Date = '2009-10-29 13:13:07.440'

SELECT DISTINCT pat.PublicationID
FROM PubAdvTransData AS pat 
    INNER JOIN PubAdvertiser AS pa 
        ON pat.AdvTransID = pa.AdvTransID
WHERE (pat.LastAdDate > @sp_Date) AND (pa.AdvertiserID = 12345))

【讨论】:

  • 如果我手动写出查询,日期方面可以正常工作,但如果我在存储过程中动态设置它,我会得到一个更大的数据集,日期由于某种原因被忽略...
  • @flavour404 - 那么,如果您尝试我在帖子中添加的两个查询,它们是否正常工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多