mysql查询日期笔记

  4. 限制查询结果如果一个查询返回许多行,但您只想看其中的几行,则可以利用LIMIT 子句,特别是与ORDER BY 子句结合时更是如此。MySQL允许限制一个查询的输出为前n 行。下面的查询选择了5 位出生日期最早的总统:

select last_name ,first_name ,birth from president ordery birth limit 5;



    如果利用ORDER BY birth DESC 按降序排序,将得到5 位最晚出生的总统。LIMIT 也可以从查询结果中取出中间部分。为了做到这一点,必须指定两个值。第一个值为结果中希望看到的第一个记录(第一个结果记录的编号为0 而不是1)。第二个值为希望看到的记录个数。下面的查询类似于前面那个查询,但只显示从第11行开始的5 个记录:


select last_name,first_name ,birth from president order by birth limit 10,5;


    自MySQL3.23.2 以来,可按照一个公式来排序查询结果。例如,利用ORDER BYRAND( ) 与LIMIT 结合,从president 表中随机抽取一个记录:
select last_name ,first_name from president order by rand() limit 1;



    5. 计算并命名输出的列值
    前面的多数查询通过从表中检索值已经产生了输出结果。MySQL还允许作为一个公式的结果来计算输出列的值。表达式可以简单也可以复杂。下面的查询求一个简单表达式的值(常量)以及一个涉及几个算术运算符和两个函数调用的较复杂的表达式的值:


select 17,format(sqrt(3*3+4*4),0);


select concat(first_name," " ,last_name),concat(city,",",state) from president;



    此查询把名和姓连接起来,中间间隔一个空格,将总统名形成一个单一字符串,而且将出生城市和州连接在一起,中间隔一个逗号,形成出生地。
在利用表达式来计算列值时,此表达式被用作列标题。如果表达式很长(如前面的一些查询样例中那样),那么可能会出现一个很宽的列。为了处理这种情况,此列可利用AS name结构来重新命名标题。这样的名称为列别名。用这种方法可使上面的输出更有意义,如下所示:


select concat(first_name,"" ,last_name) as name,concat(city,",",state) as birthplace from president;

如果列的别名包含空格,需要用双引号括起来。

select concat(first_name," ",last_name) as "president name", concat(city,",",state) as "place of birth" from president;



    6. 使用日期
   在MySQL中使用日期时要记住的是,在表示日期时首先给出年份。1999 年7 月27 日表示为“1999 - 07 - 27”,而不是像通常那样表示为“ 07 - 27 -1999”或“27 - 07 - 1999”。MySQL提供了几种对日期进行处理的方法。可以对日期进行的一些运算如下:
   ■ 按日期排序。(这点我们已经看到几次了。)
   ■ 查找特定的日期或日期范围。
   ■ 提取日期值的组成部分,如年、月或日。
   ■ 计算日期的差。
   ■ 日期增加或减去一个间隔得出另一日期。
   下面给出一些日期运算的例子。
   为了查找特定的日期,可使用精确的日期值或与其他日期值进行比较,将一个DATE 列与有关的日期值进行比较:


select * from event where date="1999-10-01";


    为了测试或检索日期的成分,可使用诸如YEAR( )、MONTH( ) 或DAYOFMONTH( ) 这样的函数。例如,可通过查找月份值为3 的日期,找出与笔者出生在相同月份(三月)的总统。
select last_name ,first_name ,birth from president where month(birth)=3;
select last_name,first_name ,birth from president where monthname(birth)="March";




    为了更详细,详细到天,可组合测试MONTH( ) 和DAYOFMONTH( ) 以找出在笔者的生日出生的总统:

select last_name,first_name,birth from president where month(birth)=3 and dayofmonth(birth)=29;



    这是一种可用来生成类似报纸上娱乐部分所刊登的那种“这些人今天过生日”清单的查询。但是,不必按前面的查询那样插入一个特殊的日期。为了查找每年的今天出生的总统,只要将他们的生日与C U R R E N T _ DATE 进行比较即可:


select last_name,first_name ,birth from president where month(birth) =month(current_date) and dayofmonth(birth)=dayofmonth(current_date);


    可从一个日期减去另一个日期。这样可以知道日期间的间隔,这对于确定年龄是非常有用的。例如,为了确定哪位总统活得最长,可将其逝世日期减去出生日期。为此,可利用函数TO _ DAYS( ) 将出生日期和逝世日期转换为天数,求出差,然后除以365 得出大概的年龄:

select last_name ,first_name,birth ,death,floor((to_days(death)-to_days(birth))/365) as age from president where death is not null order by age desc limit 5;



    此查询中所用的FLOOR( ) 函数截掉了年龄的小数部分,得到一个整数。得出日期之差,还可以确定相对于某个特定日期有多长时间。这样可以告诉历史同盟的 会员,他们还有多久就应该更新自己的 会员资格了。计算他们的截止日期和当前日期之差,如果小于某个阈值,则不久就需要更新了。下面的查询是查找需要在60 天内更新的 会员
select last_name ,first_name,expiration from member where (to_days(expiration)-to_days(current_date))<60


    自MySQL3.22 以来,可使用DATE_ADD( ) 或DATE_SUB( ) 从一个日期计算另一个日期。这些函数取一个日期及时间间隔并产生一个新日期。例如:
select date_add("1997-1-1",interval 10 year);
select date_sub("1990-1-1",interval 10 year);



   本节中前面给出的一个查询选择70 年代逝世的总统,它对选择范围的端点使用直接的日期值。该查询可以利用一个字符串日期和一个由开始日期和时间间隔计算出的结束日期来重写:

select last_name, first_name ,death from president where death>="1990-1-1" and death<date_add ("1970-1-1",interval 10 year);



    会员更新查询可根据DATE_ADD( ) 写出如下:


select last_name ,first_name ,expiration from member where expiration <date_add(current_date ,interval 60 day);


    本章前面给出了一个查询如下,确定不久要来检查但还没来诊所的牙科病人:

select last_name ,first_name,last_visit from patient where last_visit <date_sub(current_date,interval 6 month)



    现在回过头来看,读者会更清楚这个查询的含义了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值