Mysql日期类型大小比较

本文详细介绍MySQL中使用日期类型进行时间范围查询的多种方法,包括直接比较UNIX时间戳、使用NOW函数进行日期加减运算以及利用DATE_ADD和DATE_SUB函数。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

我们知道,mysql里边,日期类型有很多表现形式,date, datetime,timestamp等类型。考虑这样一种场景:

 

按时间段拉取给定时间段的内容,这时,我们就得使用日期类型的比较了。

 

表结构:tablename_tbl

 

+-----------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+-------------------+----------------+
| id | mediumint(8) | NO | PRI | NULL | auto_increment |
| title | varchar(40) | NO | | NULL | |
| content  | mediumtext | NO | | NULL | |
| addtime  | timestamp | NO | | CURRENT_TIMESTAMP | |

 

其中addtime为timestamp类型的,现在我们要拉去过去三小时内新增的记录,我们可以采取比较unix时间戳以及比较日期这两种方式实现;

 

首先看第一种:unix时间戳比较

 

Mysql内置函数:UNIX_TIMESTAMP()

 

若无参数调用,则默认返回一个 从 '1970-01-01 00:00:00' 到当前时刻的秒数(无符号整数)。若用date 来调用 unix_timestamp(),它会返回从 '1970-01-01 00:00:00' 到 date表示的时刻为止的秒数;date 可以是一个 date 字符串、一个 datetime字符串、一个 timestamp或一个当地时间的yymmdd 或yyymmdd格式的数字。

 

则sql语句可以这样写:

 

select id,title,content,addtime from tablename_tbl where UNIX_TIMESTAMP(addtime)>= UNIX_TIMESTAMP() - 10800 and UNIX_TIMESTAMP(addtime) <= UNIX_TIMESTAMP()   //10800为3小时的秒数。

 

 

 

第二种方式:日期比较

 

首先看直接使用+-运算:

 

这种方式中,特别需要注意的是,一个时间日期值加/减一个值的含义。

 

select now();
+---------------------+
| now() |
+---------------------+
| 2013-03-15 13:08:45 |
+---------------------+

 

通过now函数,我们可以获取到当前的时间,然后再请看:

 

select now(),now()+1;
+---------------------+-----------------------+
| now() | now()+1 |
+---------------------+-----------------------+
| 2013-03-15 13:10:15 | 20130315131016.000000 |
+---------------------+-----------------------+

 

select now(),now()-1;
+---------------------+-----------------------+
| now() | now()-1 |
+---------------------+-----------------------+
| 2013-03-15 13:14:18 | 20130315131417.000000 |
+---------------------+-----------------------+

 

这两条语句执行后,第二列表示是在当前时刻加上/减去 一秒,这里要注意看第二列的表示形式:

 

20130315131016.000000  (yyyy mm dd HH MM ss.000000)即:在给now()加上或者减去一个值的时候,跟now()的结果的表示形式是不同的,我们再看:

 

select now(),now()-01;
+---------------------+-----------------------+
| now() | now()-01 |
+---------------------+-----------------------+
| 2013-03-15 13:15:05 | 20130315131504.000000 |
+---------------------+-----------------------+

 

select now(),now()+01;
+---------------------+-----------------------+
| now() | now()+01 |
+---------------------+-----------------------+
| 2013-03-15 13:15:11 | 20130315131512.000000 |
+---------------------+-----------------------+

 

看到这里,很奇怪是不是,怎么直接在数字前加0也可以执行?加减的难道不是秒数吗?(我之前就是这样认为的),执行的结果也是给now()加、减1秒;

 

select now(),now()+101;
+---------------------+-----------------------+
| now() | now()+101 |
+---------------------+-----------------------+
| 2013-03-15 13:17:14 | 20130315131815.000000 |
+---------------------+-----------------------+

 

select now(),now()-101;
+---------------------+-----------------------+
| now() | now()-101 |
+---------------------+-----------------------+
| 2013-03-15 13:17:22 | 20130315131621.000000 |
+---------------------+-----------------------+

 

我们这两条语句后的执行结果,通过对比两列,我们可以发现,分别是给now()的时刻加上1分钟、1秒钟, 减去1分钟、1秒钟;再看个例子

 

select now(),now()+0101;
+---------------------+-----------------------+
| now() | now()+0101 |
+---------------------+-----------------------+
| 2013-03-15 13:19:34 | 20130315132035.000000 |
+---------------------+-----------------------+

 

select now(),now()-0101;
+---------------------+-----------------------+
| now() | now()-0101 |
+---------------------+-----------------------+
| 2013-03-15 13:19:38 | 20130315131837.000000 |
+---------------------+-----------------------+

 

是不是跟奇怪了,这两条语句同样也是给当前时间加/减1分钟1秒钟。再看一个结合了年月日的例子:

 

select now(), now()+00010203040506;
+---------------------+-----------------------+
| now() | now()+00010203040506 |
+---------------------+-----------------------+
| 2013-03-15 13:21:50 | 20140518172656.000000 |
+---------------------+-----------------------+

 

select now(), now()-00010203040506;
+---------------------+-----------------------+
| now() | now()-00010203040506 |
+---------------------+-----------------------+
| 2013-03-15 13:21:54 | 20120112091648.000000 |
+---------------------+-----------------------+

 

看到这里,我们大概就能够明白了+-的含义了吧;上边两条语句是:给当前日期加减:1年2个月3天 4小时5分钟6秒钟。

 

所以,当我们在给now()+-一个时间的时候,其实应该这样理解的:

 

+1/+01:加1秒钟

 

+101/+0101:加1分钟1秒钟

 

+10101/+010101:加1小时1分钟1秒钟

 

+1010101/+01010101:加1天1分钟1秒钟

 

+101010101/+0101010101:加1月1天1分钟1秒钟

 

+1101010101/+010101010101:加1年1月1天1分钟1秒钟,这里要注意下,年这个部分可以是4位(高位没有的话会补零):00010101010101

 

(减也是类似的)

 

所以对于前边的问题:拉去过去三小时内新增的记录, 就可以这样写sql了:

 

select id,title,content,addtime from tablename_tbl where addtime >= now() - 30000 and addtime <= now()

 

 

 

另外还有一种方式就是使用mysql提供的:

 

date_add(向日期添加指定的时间间隔), DATE_ADD(date,INTERVAL expr type)

 

date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。

 

Type 值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH

 


date_sub(向日期减去指定的时间间隔), DATE_SUB(date,INTERVAL expr type) (使用方法同date_add类似)

 

sql可以这样写:

 

select id,title,content,addtime from tablename_tbl where addtime >= date_sub(now, INTERVAL 3 HOUR) AND addtime < now()

 

(完)


<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
<think>我们正在讨论MySQL中的日期比较。用户想知道如何比较两个日期。 在MySQL中,我们可以使用比较运算符(如=, <, >, <=, >=, <>)来比较日期日期可以以字符串形式(在格式正确的情况下)或使用日期函数(如DATE())进行比较。 需要注意的是,MySQL支持多种日期时间类型,包括DATE、DATETIME、TIMESTAMP等。比较时,确保类型一致或可比较。 我们将提供一些示例: 1. 比较两个DATE类型的列或值。 2. 使用字符串表示日期进行比较(但要注意格式,MySQL默认格式是'YYYY-MM-DD')。 3. 使用函数(如CURDATE())与列进行比较。 另外,我们还可以使用日期函数来提取部分日期进行比较(如YEAR(), MONTH(), DAY()),但通常直接比较整个日期更简单。 示例表结构(假设有一个名为`orders`的表): - `order_date` DATE类型 查询示例: a. 查找所有在2023年1月1日之后的订单: SELECT * FROM orders WHERE order_date > '2023-01-01'; b. 查找今天的订单: SELECT * FROM orders WHERE order_date = CURDATE(); c. 比较两个日期列(例如,`start_date`和`end_date`): SELECT * FROM table WHERE start_date < end_date; 注意:如果日期包含时间部分(如DATETIME),那么直接比较可能会因为时间部分而影响结果。在这种情况下,我们可以使用DATE()函数来提取日期部分,或者使用时间相关的比较。 例如,比较两个DATETIME值,忽略时间部分: SELECT * FROM table WHERE DATE(datetime_column) = '2023-01-01'; 但是,使用DATE()函数可能会导致索引失效,所以如果条件允许,可以使用范围查询: SELECT * FROM table WHERE datetime_column >= '2023-01-01' AND datetime_column < '2023-01-02'; 这样可以利用索引。 因此,总结如下: - 对于DATE类型,直接比较字符串(格式为'YYYY-MM-DD')或使用日期函数。 - 对于DATETIME或TIMESTAMP类型,注意时间部分的影响,并考虑使用范围查询或DATE()函数(但注意性能)。 现在,根据要求,我们需要生成相关问题。注意,用户的问题是关于日期比较的,所以相关问题可以围绕这个主题展开。 生成的相关问题: 1. 在MySQL中,如何比较两个DATETIME值? 2. 如何忽略时间部分进行日期比较? 3. MySQL日期比较时,时区会影响结果吗? 4. 如何比较两个日期之间的间隔(例如,相差几天)? 注意:我们只生成问题,不回答。</think>### MySQL 日期比较方法 在 MySQL比较日期主要有以下 5 种方法(假设表名为 `orders`,日期列为 `order_date`): #### 1. **直接比较运算符** ```sql -- 比较固定日期 SELECT * FROM orders WHERE order_date > '2023-01-01'; -- 比较两列日期 SELECT * FROM orders WHERE delivery_date > order_date; ``` > 支持运算符:`=`, `>`, `<`, `>=`, `<=`, `<>`(不等于) #### 2. **日期函数比较** ```sql -- 与当前日期比较 SELECT * FROM orders WHERE order_date = CURDATE(); -- 特定日期部分比较 SELECT * FROM orders WHERE YEAR(order_date) = 2023; ``` > 常用函数: > - `CURDATE()`:当前日期 > - `DATE()`:提取日期部分 > - `YEAR()`/`MONTH()`/`DAY()`:提取年月日 #### 3. **日期范围查询** ```sql -- 查询某时间段内的订单 SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31'; -- 排除周末订单 SELECT * FROM orders WHERE DAYOFWEEK(order_date) NOT IN (1,7); ``` #### 4. **时间戳比较** ```sql -- 将日期转为时间戳比较 SELECT * FROM orders WHERE UNIX_TIMESTAMP(order_date) > UNIX_TIMESTAMP('2023-01-01'); ``` > 适用场景:需要精确到秒的比较 #### 5. **日期差值计算** ```sql -- 比较日期差(例如超过30天的订单) SELECT *, DATEDIFF(CURDATE(), order_date) AS days_passed FROM orders HAVING days_passed > 30; ``` > 核心函数: > - `DATEDIFF(date1, date2)`:返回天数差 > - `TIMESTAMPDIFF(unit, start, end)`:返回指定单位的差值 --- ### ⚠️ 注意事项 1. **日期格式必须一致** MySQL 默认格式为 `YYYY-MM-DD`,使用其他格式需转换: ```sql STR_TO_DATE('01/01/2023', '%d/%m/%Y') ``` 2. **NULL 值处理** 使用 `IS NULL`/`IS NOT NULL` 判断: ```sql SELECT * FROM orders WHERE delivery_date IS NULL; ``` 3. **索引优化** 避免在列上使用函数,否则索引失效: ```sql -- ❌ 错误写法(索引失效) SELECT * FROM orders WHERE YEAR(order_date) = 2023; -- ✅ 正确写法(利用索引) SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'; ``` 4. **时区问题** 使用 `CONVERT_TZ()` 处理时区差异: ```sql SELECT * FROM orders WHERE order_date > CONVERT_TZ('2023-01-01 00:00:00','UTC','+08:00'); ``` --- ### 性能优化建议 1. 优先使用 **裸列比较**(如 `date_col > '2023-01-01'`) 2. 对日期列建立索引: ```sql CREATE INDEX idx_order_date ON orders(order_date); ``` 3. 大数据表使用分区表按日期范围分区
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值