2011-07-13 39 views
11

我有一个是由一个外形像这样的SQL查询驱动的报告:如何在MYSQL中选择两周前?

SELECT batch_log.userid, 
     batches.operation_id, 
     SUM(TIME_TO_SEC(ramses.batch_log.time_elapsed)), 
     SUM(ramses.tasks.estimated_nonrecurring + ramses.tasks.estimated_recurring), 
     DATE(start_time) 
    FROM batch_log 
    JOIN batches ON batch_log.batch_id=batches.id 
    JOIN ramses.tasks ON ramses.batch_log.batch_id=ramses.tasks.batch_id 
    JOIN protocase.tblusers on ramses.batch_log.userid = protocase.tblusers.userid 
    WHERE DATE(ramses.batch_log.start_time) > "2011-02-01" 
    AND ramses.batch_log.time_elapsed > "00:03:00" 
    AND DATE(ramses.batch_log.start_time) < now() 
    AND protocase.tblusers.active = 1 
    AND protocase.tblusers.userid NOT in ("ksnow","smanning", "dstapleton") 
GROUP BY userid, batches.operation_id, date(start_time) 
ORDER BY start_time, userid ASC 

因为这是与它会导致错误的电流payperiod的时间进行比较。
我们的薪酬期从星期日开始,第一期支付期为2011年2月1日,而我们的最后一期支付期从本月4日开始。我如何将它放到我的where语句中去除查询中最近的付款期限? (现在(),间隔2周),但我真的需要一个星期的特定日子(星期日),因为它是星期三它在星期三切断它。所以现在我使用date_sub(now(),INTERVAL 2 WEEK)。

+4

查看[MySQL日期和时间函数](http://dev.mysql.com/doc/refman/5.5/en/ date-and-time-functions.html),即DATE_SUB() –

回答

27

你想使用DATE_SUB,并且作为an example

具体做法是:

select DATE_SUB(curdate(), INTERVAL 2 WEEK) 

让你两个星期前。将DATE_SUB ...部分插入到你的sql中,你很好。按您的评论

编辑:

退房DAYOFWEEK:

,你可以做线沿线的东西:

DATE_SUB(DATE_SUB(curdate(), INTERVAL 2 WEEK), INTERVAL 2 + DAYOFWEEK(curdate()) DAY) 

(我没有一个MySQL实例进行测试对..但基本上减去星期一后的天数。)

2

问题不是很清楚,特别是在编辑之后 - 现在还不清楚是“支付期限”两周或d你想从上周日回来两周吗?我认为这段时间是两周......那么你首先需要知道最近一段时间(你想忽略的时间,因为它还没有结束)一直在持续。要获得天数,你可以使用语句,比如

DATEDIFF(today, FirstPeriod) % 14 

其中FirstPeriod2011-02-01。现在,您使用date_sub()从查询中的当前日期中删除该天数。确切的表达取决于如何定义时间段,但你应该明白...