2013-02-01 85 views
3

我需要从数据库中获取最近6个月的值。 这是我的Fiddle。我需要动态获取这些值。现在二月。所以我需要8月到1月的数据库值。如果是3月份,那么这些值应该会自动更改为10月至2月。所以我需要得到最后六个月的价值。获取mysql中最近6个月的值

我的代码如下。

CREATE TABLE IF NOT EXISTS `ratepersqft` (
    `price_id` int(11) NOT NULL auto_increment, 
    `project_id` int(11) default NULL, 
    `date` varchar(255) default NULL, 
    `rate_per_sqft` double default NULL, 
    `common_location` varchar(255) default NULL, 
    PRIMARY KEY (`price_id`) 
); 

INSERT INTO `ratepersqft` (`price_id`, `project_id`, `date`, `rate_per_sqft`, `common_location`) VALUES 
    (1, 1, '2012-07-01 ', 2800, 'ECR'), 
    (2, 2, '2012-07-02 ', 1550, 'ECR'), 
    (3, 3, '2012-07-03 ', 1850, 'ECR'), 
    (4, 4, '2012-07-04 ', 4425, 'ECR'), 
    (5, 5, '2012-07-05 ', 2300, 'ECR'), 
    (6, 1, '2012-08-01 ', 2900, 'ECR'), 
    (7, 2, '2012-08-02 ', 1650, 'ECR'), 
    (8, 3, '2012-08-03 ', 1950, 'ECR'), 
    (9, 4, '2012-08-04 ', 4525, 'ECR'), 
    (10, 5, '2012-08-05 ', 2200, 'ECR'), 
    (11, 1, '2012-09-01 ', 3000, 'ECR'), 
    (12, 2, '2012-09-02 ', 1450, 'ECR'), 
    (13, 3, '2012-09-03 ', 2050, 'ECR'), 
    (14, 4, '2012-09-04 ', 4625, 'ECR'), 
    (15, 5, '2012-09-05 ', 2100, 'ECR'), 
    (16, 1, '2012-10-01 ', 3100, 'ECR'), 
    (17, 2, '2012-10-02 ', 2150, 'ECR'), 
    (18, 3, '2012-10-03 ', 1850, 'ECR'), 
    (19, 4, '2012-10-04 ', 4725, 'ECR'), 
    (20, 5, '2012-10-05 ', 1900, 'ECR'), 
    (21, 1, '2012-11-01 ', 3200, 'ECR'), 
    (22, 2, '2012-11-02 ', 2250, 'ECR'), 
    (23, 3, '2012-11-03 ', 1850, 'ECR'), 
    (24, 4, '2012-11-04 ', 4825, 'ECR'), 
    (25, 5, '2012-11-05 ', 2300, 'ECR'), 
    (26, 1, '2012-12-01 ', 3300, 'ECR'), 
    (27, 2, '2012-12-02 ', 2350, 'ECR'), 
    (28, 3, '2012-12-03 ', 1850, 'ECR'), 
    (29, 4, '2012-12-04 ', 4925, 'ECR'), 
    (30, 5, '2012-12-05 ', 2400, 'ECR'), 
    (31, 1, '2013-01-01 ', 3400, 'ECR'), 
    (32, 2, '2013-01-02 ', 2000, 'ECR'), 
    (33, 3, '2013-01-03 ', 2450, 'ECR'), 
    (34, 4, '2013-01-04 ', 5025, 'ECR'), 
    (35, 5, '2013-01-05 ', 2500, 'ECR'), 
    (36, 1, '2013-02-01 ', 3500, 'ECR'), 
    (37, 2, '2013-02-02 ', 2100, 'ECR'), 
    (38, 3, '2013-02-03 ', 2550, 'ECR'), 
    (39, 4, '2013-02-04 ', 5125, 'ECR'), 
    (40, 5, '2013-02-05 ', 2600, 'ECR'), 
    (41, 1, '2012-06-01 ', 1800, 'ECR'), 
    (42, 2, '2012-06-02 ', 1150, 'ECR'), 
    (43, 3, '2012-06-03 ', 1350, 'ECR'), 
    (44, 4, '2012-06-04 ', 3425, 'ECR'), 
    (45, 5, '2012-06-05 ', 2100, 'ECR'); 

我试着这个查询,它给我所有的数据库中的值。

SELECT * 
    FROM ratepersqft 
WHERE MONTH(date) < DATE_SUB(CURDATE(), INTERVAL 6 MONTH) 

希望我的问题很明确。提前致谢!!!

+0

您已经标记为MySQL和SQL数据库......究竟哪一个? :-) – bonCodigo

+0

这是mysql。你可以参考小提琴 –

+0

啊,你没有指定将来的记录应该排除。我正在更改我的答案以添加此要求 – mvp

回答

14

对于MySQL:你可以使用date_add

SELECT * FROM ratepersqft 
WHERE date < Now() and date > DATE_ADD(Now(), INTERVAL- 6 MONTH); 

对于SQL Server :, dateadd

SELECT * FROM ratepersqft 
WHERE date < Now() and date > DATEADD(Month, -6, Now()); 

http://www.sqlfiddle.com/#!2/1f8029/48

**请给它反引号包住日期列名是一个保留关键字。 **

MYSQL更新:

SQLFIDDLE DEMO

SELECT * 
FROM ratepersqft 
WHERE date_format(date,'%Y-%m') < 
        date_format(now(),'%Y-%m') 
and date_format(date,'%Y-%m') >= 
        date_format(now() - interval 6 month,'%Y-%m') 
order by date desc; 
+0

Now()在SQL Server中不存在。对于SQL Server使用getdate()[http://forums.asp.net/t/1431963.aspx?+NOW+is+not+a+recognized+built+in+function+name+](http://forums。 asp.net/t/1431963.aspx?+NOW+is+not+a+recognized+built+in+function+name+) – user1

4

这会考虑所有日期四舍五入到月供比较的开始,将得到近6个月,从今天的日期:

SELECT * 
FROM ratepersqft 
WHERE date >= DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 6 MONTH) 
    AND date < DATE_FORMAT(CURDATE(), '%Y-%m-01') 

强制SQLFiddle

+0

它获得了7个月的价值。 –

+0

它给出的最早值是'2012-08-02'。据我所知,这是6个月前。如果确切的日子很重要,你可能想使用'> ='而不是'>'。或者你必须从本月1日开始获得价值观? – mvp

+0

+1和DATE_SUB'配对:) – bonCodigo

1

SQLFiddle

如果你想整月仅

SELECT * 
FROM ratepersqft 
WHERE date between date_format(DATE_SUB(CURDATE(), INTERVAL 6 MONTH), '%Y-%m-01') 
      and date_sub(date_format(CURDATE(), '%Y-%m-01'), interval 1 day); 
+0

它仅获得最后5个月的值。我对吗? –

+0

@VigneshGopalakrishnan请参阅更新的答案。 –

-1
SELECT 
YEAR(DATE) AS YEAR, 
SUM(MONTH(DATE) = 1) AS JAN , 
SUM(MONTH(DATE) = 2) AS FEB , 
SUM(MONTH(DATE) = 3) AS MAR , 
SUM(MONTH(DATE) = 4) AS APR, 
SUM(MONTH(DATE) = 5) AS MAY , 
SUM(MONTH(DATE) = 6) AS JUNE , 
SUM(MONTH(DATE) = 7) AS JULY , 
SUM(MONTH(DATE) = 8) AS AUG, 
SUM(MONTH(DATE) = 9) AS SEP , 
SUM(MONTH(DATE) = 10) AS OCTOBER , 
SUM(MONTH(DATE) = 11) AS NOV , 
SUM(MONTH(DATE) = 12) AS DECE 
FROM ratepersqft 
WHERE DATE >= NOW() - INTERVAL 6 MONTH 
GROUP BY 1;