选择给出不同日期格式的不同结果



我正在SQL Server上建立一个查询,我有以下行:

SELECT ISNULL(CONVERT(INT, SUM(fi.qtt)), 0)
FROM   fi,
st
WHERE  st.ref = fi.ref
AND rdata LIKE '%2021%' 

很有魅力。唯一的问题是,我希望它得到去年的结果,而不是确定年份(2021年)。所以我到了这一步:

SELECT ISNULL(CONVERT(INT, SUM(fi.qtt)), 0)
FROM   fi,
st
WHERE  st.ref = fi.ref
AND rdata LIKE '%DATEADD(year,-1,GETDATE())%' 

结果为0 (0)

我哪里错了?

不能使用LIKE 'SomeCodeHere',因为LIKE不执行任何操作,它只期望字符串模式。

对于日期,最好使用日期范围。这意味着您将能够正确地利用索引。

您还应该使用显式连接语法,而不是几十年前已弃用的旧的逗号连接语法。

SELECT ISNULL(CONVERT(INT, SUM(fi.qtt)), 0)
FROM  fi
JOIN  st ON st.ref = fi.ref
WHERE rdata >= DATEFROMPARTS(YEAR(GETDATE()) - 1, 1, 1)
AND rdata <  DATEFROMPARTS(YEAR(GETDATE())    , 1, 1);

您问题中的问题是因为您需要将DATEADD()的结果连接到LIKE操作中使用的字符串:

SELECT ISNULL(CONVERT(INT, SUM(fi.qtt)), 0)
FROM   fi,
st
WHERE  st.ref = fi.ref
AND rdata LIKE '%' + DATEADD(year, -1, GETDATE()) + '%' 

但是你应该注意到更好的方法是使用YEAR()函数:

SELECT ISNULL(CONVERT(INT, SUM(fi.qtt)), 0)
FROM   fi,
st
WHERE  st.ref = fi.ref
AND YEAR(rdata) = YEAR(GETDATE()) - 1 
SELECT ISNULL(CONVERT(INT, SUM(fi.qtt)), 0)
FROM   fi,
st
WHERE  st.ref = fi.ref
AND rdata LIKE '%'+Convert(varchar(25),Year(DATEADD(year, -1, GETDATE())))+'%'

通过查看您的查询,我认为rdata包含varchar数据与日期部分。这个查询应该可以工作。

最新更新