2017-06-05 45 views
0

我想显示用户选择年份3月到明年4月的数据(例如:如果用户选择2017年,则需要选择从2017年3月到4月的数据2018年)。过滤它的最佳查询是什么?它应该是从所选年份开始的顺序。选择查询过滤来自特定年份和月份的数据

SELECT DATEPART(mm,submitted_date),SUM(total_count),YEAR(submitted_date) 
FROM store_details 
WHERE YEAR(submitted_date) = '2017' 
AND MONTH(submitted_date) >=3 
Group By YEAR(submitted_date),DATEPART(mm,submitted_date) 
Order By YEAR(submitted_date),DATEPART(mm,submitted_date) 

回答

0

那么,SQL Server的更高版本(2012+)有一个很好的内置函数,称为datefromparts。但是,由于您的问题被标记为,除非您可以升级您的数据库(并且您真的应该考虑它,自2005年以来不再受Microsoft支持),否则这并没有多大帮助。

但是,因为你知道你想要的所有三月和次年4月之间的数据,你可以简单地这样做:

SELECT DATEPART(MONTH,submitted_date),SUM(total_count),YEAR(submitted_date) 
FROM store_details 
WHERE submitted_date >= CAST(CAST(@Year as char(4)) + '-03-01 00:00:00' As datetime) 
WHERE submitted_date < CAST(CAST(@Year + 1 as char(4)) + '-04-01 00:00:00' As datetime) 

Group By YEAR(submitted_date),DATEPART(MONTH,submitted_date) 
Order By YEAR(submitted_date),DATEPART(MONTH,submitted_date) 

(也就是说,假设用户提供了一年的int值。 )

+0

在'CAST'附近显示语法不正确,预计'AS'。@ Year在参数化查询中作为2017传递 – user2431727

+0

我已经很快关闭括号。现在试试。 –

+0

明白了。请更正与答案在哪里。 WHERE submitted_date> = CAST(CAST(@Year as char(4))+'-03-01 00:00:00'as datetime) AND submitted_date user2431727

0

如果你已经在手的起始月份和日期,那么我不明白为什么你不能只是增加一个上限的日期在WHERE条款:

SELECT 
    DATEPART(mm, submitted_date), 
    SUM(total_count), 
    YEAR(submitted_date) 
FROM store_details 
WHERE 
    (YEAR(submitted_date) = '2017' AND MONTH(submitted_date) >= 3) AND 
    (YEAR(submitted_date) = '2018' AND MONTH(submitted_date) < 4) 
GROUP BY 
    YEAR(submitted_date), 
    DATEPART(mm, submitted_date) 
ORDER BY 
    YEAR(submitted_date), 
    DATEPART(mm, submitted_date)