gpt4 book ai didi

mysql - 显式日期/日期时间转换

转载 作者:行者123 更新时间:2023-11-29 03:48:24 25 4
gpt4 key购买 nike

BETWEEN 文档描述 ( http://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#operator_between ) 中,我注意到一个我无法完全理解的奇怪表达:

For best results when using BETWEEN with date or time values, use CAST() to explicitly convert the values to the desired data type. Examples: If you compare a DATETIME to two DATE values, convert the DATE values to DATETIME values. If you use a string constant such as '2001-1-1' in a comparison to a DATE, cast the string to a DATE.

所以我有以下问题:

  1. 确实有必要(并对此进行解释)以及cast 会显着改变结果或性能时,谁能提供一个示例。假设我们使用 mysql 定义的日期文字之一 ( http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html )。为了简单起见,让它成为 YYYY-MM-DD ('2013-07-26') 格式(你喜欢的任何日期)

    <
  2. 谁能解释一下“最佳结果”是什么意思?结果要么符合预期,要么不符合预期 - 在这种情况下,“最佳”是什么?

PS:目标 mysql 版本是最新的 5.5 和更新版本。

PPS:把事情说清楚:

  • 这个问题假设我们使用日期时间/日期兼容的列,而不是 varchars 等
  • 问题是关于扩展类型,而不是缩小类型

最佳答案

看一个简单的例子(MySql 5.6):

drop table dattes;
create table dattes(
id int,
da_te date,
name varchar(200)
);

set @x = 0;
insert into dattes
select (@x:=@x+1),
'2013-5-1' + interval @x day,
t.column_name
from information_schema.columns t
;

这是一个查询:

Set @start_date = cast( '2013-5-2' as date);
Set @start_datetime = cast( '2013-5-2 15:00' as datetime);
Set @end_date = cast( '2013-5-10' as date);

select (Select sum( id ) from dattes
where da_te between @start_date and @end_date) da_test1,

(Select sum( id ) from dattes
where da_te between @start_datetime and @end_date) da_test2,

(Select sum( id ) from dattes
where da_te between cast( @start_datetime as date)
and @end_date) da_test3
;
+ ------------- + ------------- + ------------- +
| da_test1 | da_test2 | da_test3 |
+ ------------- + ------------- + ------------- +
| 45 | 44 | 45 |
+ ------------- + ------------- + ------------- +

在第二种情况下,人们会期望 MySql 会隐含地将 @start_datetime 转换为日期(因为表中的列 da_te 是日期)-> 但 MySql 做的恰恰相反,它将其他参数扩展为日期时间。因此,表中的一条记录被跳过('2013-5-2 00:00' < '2013-5-2 15:00')。

这当然会影响性能(可能不会显着,但有一点),因为 MySql 必须将所有列值(或索引值,如果有的话)从日期转换为日期时间。

关于mysql - 显式日期/日期时间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17805820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com