我正在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数据与日期部分。这个查询应该可以工作。