使用mysql日期與時間函數輕易搞定日期與時間邏輯

mysql查詢當天的數據:

select* from procurement where date(createDate)=curdate()  order by refreshDatetime   desc ;複製代碼

mysql查詢過去幾天的數據:

select * from procurement 
        where DATEDIFF(NOW(),createDate)<6 and DATEDIFF(NOW(),createDate)>=0  where
        order by refreshDatetime   desc複製代碼

mysql函數無非是三類:得到時間。設置時間。格式化時間。javascript

curdate函數用來返回當前的日期:php

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2014-09-11 |
+------------+
1 row in set

mysql>複製代碼
mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2014-09-11 |
+------------+
1 row in set

mysql> select curdate()+0;
+-------------+
| curdate()+0 |
+-------------+
|    20140911 |
+-------------+
1 row in set

mysql> 
curtime函數返回當前時間。


mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 16:26:59  |
+-----------+
1 row in set

mysql> select curtime()+0;
+-------------+
| curtime()+0 |
+-------------+
|      162721 |
+-------------+
1 row in set

mysql>複製代碼

相似的,java

mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2014-09-11 16:28:49 |
+---------------------+
1 row in set

mysql> select current_timestamp()+0;
+-----------------------+
| current_timestamp()+0 |
+-----------------------+
|        20140911162915 |
+-----------------------+
1 row in set

mysql>複製代碼

其中:
CURRENT_TIMESTAMP和CURRENT_TIMESTAMP()是NOW()的同義詞mysql

date()用於從一個時間表達式中間提取出日期,它會判斷表達式是否正確,若是不正確,將會獲得空:

mysql> select date('2010-11-10');
+--------------------+
| date('2010-11-10') |
+--------------------+
| 2010-11-10         |
+--------------------+
1 row in set

mysql> select date('2010-11-01 12:03:07');
+-----------------------------+
| date('2010-11-01 12:03:07') |
+-----------------------------+
| 2010-11-01                  |
+-----------------------------+
1 row in set

mysql> select date('2010-11-71 12:03:07');
+-----------------------------+
| date('2010-11-71 12:03:07') |
+-----------------------------+
| NULL                        |
+-----------------------------+
1 row in set

mysql> select date('2010-11-71 12:93:07');
+-----------------------------+
| date('2010-11-71 12:93:07') |
+-----------------------------+
| NULL                        |
+-----------------------------+
1 row in set

mysql> 

date函數得到日期與分隔符無關
mysql> select date('20101101');
+------------------+
| date('20101101') |
+------------------+
| 2010-11-01       |
+------------------+
1 row in set

mysql> select date('2010111111');
+--------------------+
| date('2010111111') |
+--------------------+
| 2020-10-11         |
+--------------------+
1 row in set

mysql> select date('2010x11x1111'); //出錯的緣由是由於日是1111,與分隔符無關
+----------------------+
| date('2010x11x1111') |
+----------------------+
| NULL                 |
+----------------------+
1 row in set

mysql> select date('2010*11*11 11');
+-----------------------+
| date('2010*11*11 11') |
+-----------------------+
| 2010-11-11            |
+-----------------------+
1 row in set

mysql> 

獲得時間差的函數:

mysql> select datediff('1995-11-09',now());
+------------------------------+
| datediff('1995-11-09',now()) |
+------------------------------+
|                        -6881 |
+------------------------------+
1 row in set

mysql> select datediff(now(),'1995-11-09');
+------------------------------+
| datediff(now(),'1995-11-09') |
+------------------------------+
|                         6881 |
+------------------------------+
1 row in set

mysql>複製代碼

如今有一個問題,好比須要知道最近三十天登陸的用戶,該怎麼作:
一種方法是與PHP結合sql

<?php
$time=date("Y-m-d",strtotime("-30 day"));
echo $time;
?>複製代碼

若是精確到秒的話函數

$time=date("Y-m-d H:i:s",strtotime("-30 day"));複製代碼

30天前就是-30.
注意:日期是能夠直接比較大小的:spa

select userId from travel_plan where startDate>'2010-10-10';操作系統

date_sub函數,返回一個過去的時間差。code

mysql> select date_sub(now(),interval 30 day);
+---------------------------------+
| date_sub(now(),interval 30 day) |
+---------------------------------+
| 2014-08-12 17:17:29             |
+---------------------------------+
1 row in set

mysql> select date_sub('2010-11-01',interval 30 day);
+----------------------------------------+
| date_sub('2010-11-01',interval 30 day) |
+----------------------------------------+
| 2010-10-02                             |
+----------------------------------------+
1 row in set

mysql> 

date_add返回一個將來的時間差:
mysql> select date_add('2010-11-01',interval 30 day);
+----------------------------------------+
| date_add('2010-11-01',interval 30 day) |
+----------------------------------------+
| 2010-12-01                             |
+----------------------------------------+
1 row in set

mysql> select date_add(now(),interval 30 day);
+---------------------------------+
| date_add(now(),interval 30 day) |
+---------------------------------+
| 2014-10-11 17:22:46             |
+---------------------------------+
1 row in set

mysql>複製代碼

我是如何運用這些的
mysql有一個問題,就是好比select now 獲得的是系統時間,是根據操做系統當前時間來肯定的。
可是使用utc函數的時候,就差8個小時,是根據utc0來肯定的,就再也不依據系統當前的時區了。ip

相關文章
相關標籤/搜索