在SQL中记录月份和年份组合之间的记录

时间:2014-02-28 10:32:05

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

任何人都知道如何在月份和年份组合之间选择数据。这是我的代码。

DECLARE @StartYear int
DECLARE @EndYear int
DECLARE @StartMonth int
DECLARE @EndMonth int

SET @StartYear = DATEPART(Year,'01-01-1753')
SET @StartMonth = DATEPART(Month,'01-01-1753')
SET @EndYear  = DATEPART(YEAR,DATEADD(month,-1,GETDATE()))
SET @EndMonth = DATEPART(MONTH,DATEADD(month,-1,GETDATE()))


SELECT station_id,
      DATEPART(YEAR,date_time) AS YEAR,
      DATEPART(MONTH,date_time) AS MONTH,
      CONVERT(date,date_time) AS DATE,
      DATENAME(weekday,date_time) AS weekday,
        sum(volume) AS Total_volume
   FROM rvtcs_data_aggregated_hourly 
   WHERE DATEPART(MONTH,date_time) > @StartMonth AND DATEPART(YEAR,date_time)= @StartYear
   AND DATEPART(MONTH,date_time) <= @EndMonth AND DATEPART(YEAR,date_time)= @EndYear
   GROUP BY station_id,
        CONVERT(date,date_time),
        DATEPART(MONTH,date_time),
        DATEPART(YEAR,date_time),
        DATENAME(weekday,date_time)

我尝试过类似的东西,但即使有数据也不会返回日期

3 个答案:

答案 0 :(得分:1)

使用函数计算年 - 月的第一天(结束日期,添加一个月),然后将>=<用于date_time列:

WHERE date_time >= DATEADD(year, 
                           @StartYear-2000, 
                           DATEADD(month, @StartMonth-1, '20000101'))
  AND date_time <  DATEADD(year, 
                           @EndYear-2000, 
                           DATEADD(month, 1+@EndMonth-1, '20000101'))

答案 1 :(得分:0)

我看了下面的2个链接,我个人更喜欢数字:

where datepart(year, date_time) * 100 + datepart(month, date_time) 
between @startyear *100 + @startmonth 
and @endyear *100 + @endmonth

答案 2 :(得分:0)

如果您有开始日期和结束日期,并且您想要选择这些日期之间的所有记录,包括与这些日期具有相同月份和年份的记录,那么我认为您无需提取月份和年份部分明确,而不是尝试以下:

通过在以下表达式中将GETDATE()替换为@EndDate,获取@EndDate下个月的第一天:

DATEADD(mm,1,CONVERT(VARCHAR(25),DATEADD(dd,-DAY(GETDATE())+1, GETDATE()),101))

通过在以下表达式中将GETDATE()替换为@StartDate,获取@StartDate月份的第一天:

CONVERT(VARCHAR(25),DATEADD(dd,-DAY(GETDATE())+1, GETDATE()),101)

WHERE条件下使用这两个表达式,如下所示

...
WHERE your_date_field >= CONVERT(VARCHAR(25),DATEADD(dd,-DAY(@StartDate)+1, @StartDate),101)
  AND your_date_field < DATEADD(mm,1,CONVERT(VARCHAR(25),DATEADD(dd,-DAY(GETDATE())+1, GETDATE()),101))  
相关问题