【问题标题】:Take records between Month and year combination in SQL在 SQL 中获取月份和年份组合之间的记录
【发布时间】:2014-02-28 10:32:04
【问题描述】:

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

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)

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

【问题讨论】:

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


【解决方案1】:

使用函数计算年月的第一天(对于结束日期,添加一个月),然后将它们与 &gt;=&lt; 一起用于 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'))

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      通过在以下表达式中将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))  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多