MySql 日期范围查询

街头小贩 2018-10-18 10:55:34
T1表中有`YEAR`,`MONTH`,`DAY`;这三列,现在要进行Date BETWEEN AND查询,如何把这三列转成Date
...全文
438 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
街头小贩 2018-10-18
  • 打赏
  • 举报
回复
关键 是能否实现between范围查询?加个列例不是事哈
卖水果的net 版主 2018-10-18
  • 打赏
  • 举报
回复

-- 给你写个例子,你参考一下

mysql> use test;
Database changed
mysql> 
mysql> 
mysql> create table test(
    -> id int, 
    -> year int, 
    -> month int, 
    -> day int, 
    -> crdate varchar(10) generated always as (concat_ws('-',year, month, day))
    -> );
e = '2018-10-18';

drop table test;


Query OK, 0 rows affected (0.02 sec)

mysql> 
mysql> insert into test(id, year, month,day) values(1,'2018','10','18'),(2,'2018','10','19');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> 
mysql> select * from test where crdate = '2018-10-18';
+------+------+-------+------+------------+
| id   | year | month | day  | crdate     |
+------+------+-------+------+------------+
|    1 | 2018 |    10 |   18 | 2018-10-18 |
+------+------+-------+------+------------+
1 row in set (0.00 sec)

mysql> 
mysql> drop table test;
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> 



街头小贩 2018-10-18
  • 打赏
  • 举报
回复
引用 2 楼 wmxcn2000 的回复:
如果你是 5.7 或以上版本的话,建议做一个计算列,把这三个列计算到 这个列中,还可以加索引,提高效率。 如果就 5.7 以下版本,也建议在程序中,把这三个列拼接后,插入到这个列中。
多一个列:YYYY-MM-DD吗?这样使用此列也可以使用Between and吗
卖水果的net 版主 2018-10-18
  • 打赏
  • 举报
回复
如果你是 5.7 或以上版本的话,建议做一个计算列,把这三个列计算到 这个列中,还可以加索引,提高效率。 如果就 5.7 以下版本,也建议在程序中,把这三个列拼接后,插入到这个列中。
街头小贩 2018-10-18
  • 打赏
  • 举报
回复
现在用的是:
SELECT * FROM T1 AS tr WHERE STR_TO_DATE(CONCAT_WS('-',tr.`YEAR`,tr.`MONTH`,tr.`DAY`),'%Y-%m-%e') BETWEEN ? AND ?
还有没有更合适的函数或其它方式实现
街头小贩 2018-10-18
  • 打赏
  • 举报
回复
方式1: 不加列的情况实现传入指定日期实现日期范围过滤 方式2: 不用Between实现传入指定日期实现日期范围过滤 我发现所有回复都在按一个路子回复,所以才结贴了
吉普赛的歌 版主 2018-10-18
  • 打赏
  • 举报
回复
引用 15 楼 xiaofanku 的回复:
[quote=引用 14 楼 yenange 的回复:] [quote=引用 13 楼 xiaofanku 的回复:]
我在 #10 不是完完全全按你的要求弄了吗? 其它人也说得差不多了。 不明白你为啥要搞个无满意结帖, 这样做对得起这么多为你回贴的朋友?[/quote]你们的回复不是我想要的答案呀[/quote] 你还要想啥?
街头小贩 2018-10-18
  • 打赏
  • 举报
回复
引用 14 楼 yenange 的回复:
[quote=引用 13 楼 xiaofanku 的回复:]
我在 #10 不是完完全全按你的要求弄了吗? 其它人也说得差不多了。 不明白你为啥要搞个无满意结帖, 这样做对得起这么多为你回贴的朋友?[/quote]你们的回复不是我想要的答案呀
吉普赛的歌 版主 2018-10-18
  • 打赏
  • 举报
回复
引用 13 楼 xiaofanku 的回复:
我在 #10 不是完完全全按你的要求弄了吗? 其它人也说得差不多了。 不明白你为啥要搞个无满意结帖, 这样做对得起这么多为你回贴的朋友?
街头小贩 2018-10-18
  • 打赏
  • 举报
回复
二月十六 版主 2018-10-18
  • 打赏
  • 举报
回复
引用 9 楼 xiaofanku 的回复:
引用 8 楼 sinat_28984567 的回复:
加的哪一列计算列不是date类型?
列类型是date当然可以了

那还需要转换什么?你把计算列设置成date类型,直接between用就好了
卖水果的net 版主 2018-10-18
  • 打赏
  • 举报
回复
引用 7 楼 xiaofanku 的回复:
我测试的不可以,还需要转成Date才可以:
这个取决于你计算列的类型,你按你的实际需求,自己定义就可以了。 我只是写个例子,你结合业务自由发挥。
吉普赛的歌 版主 2018-10-18
  • 打赏
  • 举报
回复
计算列可以 between 日期了, 索引也帮你加上了:
drop table if exists `t`;
create table `t`(
    `id` int PRIMARY KEY, 
    `year` int, 
    `month` int, 
    `day` int, 
    `ymd` date generated always as (STR_TO_DATE(concat_ws('-',year, month, day),'%Y-%m-%e'))
);
CREATE index ix_t_ymd on `t`(`ymd`);

insert into `t`(`id`,`year`,`month`,`day`) values(1,2018,10,1);
insert into `t`(`id`,`year`,`month`,`day`) values(2,2018,10,2);
insert into `t`(`id`,`year`,`month`,`day`) values(3,2018,10,3);
insert into `t`(`id`,`year`,`month`,`day`) values(4,2018,10,4);
insert into `t`(`id`,`year`,`month`,`day`) values(5,2018,10,5);

SELECT * from `t` where `ymd` between '2018-10-02' and '2018-10-04';
街头小贩 2018-10-18
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
加的哪一列计算列不是date类型?
列类型是date当然可以了
二月十六 版主 2018-10-18
  • 打赏
  • 举报
回复
加的哪一列计算列不是date类型?
街头小贩 2018-10-18
  • 打赏
  • 举报
回复
引用 6 楼 wmxcn2000 的回复:
[quote=引用 5 楼 xiaofanku 的回复:] 关键 是能否实现between范围查询?加个列例不是事哈
可以的 PS: 个回复一下帖子的时间,早就试出来了。[/quote] 我测试的不可以,还需要转成Date才可以: A 数据不对: B 正确:
卖水果的net 版主 2018-10-18
  • 打赏
  • 举报
回复
引用 5 楼 xiaofanku 的回复:
关键 是能否实现between范围查询?加个列例不是事哈
可以的 PS: 个回复一下帖子的时间,早就试出来了。

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧