现在数据库结构如下ID AddTime EndTime
===================================================
1 2009-06-01 09:00:00 2009-06-14 09:00:00
2 2009-06-02 09:00:00 2009-06-14 09:00:00
3 2009-06-03 09:00:00 2009-06-14 09:00:00
4 2009-06-04 09:00:00 2009-06-14 09:00:00
5 2009-06-05 09:00:00 2009-06-14 09:00:00
6 2009-06-06 09:00:00 2009-06-14 09:00:00
7 2009-06-07 09:00:00 2009-06-14 09:00:00我想查询字段“EndTime”大于字段“AddTime”加上10天的信息,如何做。还有,可不可以对字段“AddTime”进行一段代码操作后进行查询。
比如说,我做了个封装处理函数,函数是处理一个时间(比如2009-01-01 12:00:00)5天后,其中对双休日、节假日、节假调休日日期进行了追加,这样一个函数。然后我想对数据库字段“AddTime”进行这样一个函数处理后,再和字段“EndTime”进行比较。不知道说的明不明确,嘴笨没办法。
希望大家能够提供好的建议。
===================================================
1 2009-06-01 09:00:00 2009-06-14 09:00:00
2 2009-06-02 09:00:00 2009-06-14 09:00:00
3 2009-06-03 09:00:00 2009-06-14 09:00:00
4 2009-06-04 09:00:00 2009-06-14 09:00:00
5 2009-06-05 09:00:00 2009-06-14 09:00:00
6 2009-06-06 09:00:00 2009-06-14 09:00:00
7 2009-06-07 09:00:00 2009-06-14 09:00:00我想查询字段“EndTime”大于字段“AddTime”加上10天的信息,如何做。还有,可不可以对字段“AddTime”进行一段代码操作后进行查询。
比如说,我做了个封装处理函数,函数是处理一个时间(比如2009-01-01 12:00:00)5天后,其中对双休日、节假日、节假调休日日期进行了追加,这样一个函数。然后我想对数据库字段“AddTime”进行这样一个函数处理后,再和字段“EndTime”进行比较。不知道说的明不明确,嘴笨没办法。
希望大家能够提供好的建议。
set EndTime=DATE_ADD(AddTime,INTERVAL 10 DAY)
where EndTime>AddTime;不知道这是不是你要的。如果你直接根据你提供的测试数据给出正确的输出结果,这样容易避免误解。
select * from yourTable
where EndTime>DATE_ADD(AddTime,INTERVAL 10 DAY)
select * from tt where EndTime>DATE_ADD(AddTime,INTERVAL 10 DAY)
or
select * from tt where EndTime>(AddTime+INTERVAL 10 DAY)
比如说,我做了个封装处理函数,函数是处理一个时间(比如2009-01-01 12:00:00)5天后,其中对双休日、节假日、节假调休日日期进行了追加,这样一个函数。然后我想对数据库字段“AddTime”进行这样一个函数处理后,再和字段“EndTime”进行比较。应该可以,举例说明
首先,谢谢各位的指点,第一个问题已经得到解决,看来SQL方面本人还要再加强点学习。ID AddTime EndTime
===================================================
1 2009-06-01 09:00:00 2009-06-14 09:00:00
2 2009-06-02 09:00:00 2009-06-14 09:00:00
3 2009-06-03 09:00:00 2009-06-14 09:00:00日期表:
日 期:6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12 6.13 6.14 6.15 6.16
星 期:一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二
节假日: 清明节第二个问题是这样的,我说的详细点。
比如说,字段“AddTime”的时间是“2009-06-01 09:00:00”,10天后按正常来算的话应该是“2009-06-11 09:00:00”,但在这10天内是有双休日的,比如6月1号是星期一,那么到6月6号是星期六,不计算到10天之内,6月7号是星期天当然也不计算在内,那么得到的日期应该是“2009-06-13 09:00:00”,可是按照星期的周期来算的话,6月13号是星期六,也就不算在内了,最后的结果日期是“2009-06-15 09:00:00”。其实就是按照正常工作日算的日期,踢出双休日而已。这只是一种情况,还有一种比较麻烦,所以我把这些日期规则做成了一个封装的函数。举一下例子吧:刚才上面说的是双休日,我打个比方,在上面的日期表中已经列出,6月11号是“清明节”,那么6月11日和12日是要放假的咯,比方说6月14日要补一天班,那么就属于正常工作日了,现在字段“AddTime”开始时间是“2009-06-01 09:00:00”,10天后按照上面说的最后日期应该是“2009-06-15 09:00:00”,但其中6月11日和12日是节日放假,所以属于节假日,不算做正常工作日,所以要踢出,而6月14日呢,虽然是星期天,但是补节假日的班,所以属于正常工作日,所以最后的日期应该是“2009-06-16 09:00:00”了。累死了,应该够详细了,我把这一部分日期规则封装成了一个类,所以想在数据库查询的时候,对字段“AddTime”进行一个类的操作后,得到一个日期结果,再和字段“EndTime”进行比较。
如果是,应该可以。新的EndTime是存入在表中,还是临时计算?
不过在认为最为简单有效的方法基础上可以采用其他方式。
SELECT MAX(RQ) FROM (
select *
from ldbrq where nweek-6<0 and rq<='2009-06-01' +interval 10 day AND BZ IS NULL
UNION
select *
from ldbrq where nweek-6<0 and rq>'2009-06-01' AND BZ IS NULL
LIMIT 10) A1
DELIMITER $$DROP PROCEDURE IF EXISTS `zz`.`rqpd`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `rqpd`()
BEGIN
declare qq date;
set qq='2009-6-1';
while qq<='2009-6-30' do
insert into test.ldbrq values (qq,WEEKday(qq)+1);
set qq=qq+interval 1 day;
end while;
END$$DELIMITER ;
sq:
SELECT MAX(RQ) as newendtime FROM (
select *
from ldbrq where nweek-6<0 and rq<='2009-06-02' +interval 10 day AND BZ IS NULL AND RQ>='2009-06-02'
UNION
select *
from ldbrq where nweek-6<0 and rq>'2009-06-02' AND BZ IS NULL LIMIT 10) A1测试时,用了具体日期,你可以将'2009-06-02'->AddTime
select *,tmaxsj(addtime) from tsj;DELIMITER $$
drop function if exists tmaxsj$$
CREATE FUNCTION `zz`.`tmaxsj`(dd datetime)
RETURNS datetime
BEGINSELECT MAX(RQ) into @newendtime FROM (
select *
from `test`.ldbrq where nweek-6 <0 and rq <=dd +interval 10 day AND BZ IS NULL AND RQ>=dd
UNION
select *
from `test`.ldbrq where nweek-6 <0 and rq>dd AND BZ IS NULL LIMIT 10) A1;
return @newendtime;
END$$DELIMITER ;
BEGIN
declare dd date;
set dd=date(dd1);
SELECT MAX(RQ) into @newendtime FROM (
select *
from `test`.ldbrq where nweek-6<0 and rq between dd and dd +interval 10 day AND BZ IS NULL
UNION
select *
from `test`.ldbrq where nweek-6<0 and rq>dd AND BZ IS NULL LIMIT 10) A1;
return cast(concat(@newendtime,' ',time(dd1)) as datetime);
END$$DELIMITER ;