首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >mysql日期/时间计算

mysql日期/时间计算
EN

Stack Overflow用户
提问于 2013-01-09 17:13:20
回答 1查看 491关注 0票数 1

我有以下数据库结构:

mysql>从调度器中选择*;

+----+-------------------+-----------+-----------+-----------+---------+----------+ | id | name | daystart | hourstart | dayend | hourend | tariff | +----+-------------------+-----------+-----------+-----------+---------+----------+ | 6 | Monday morning | Monday | 00:00 | Monday | 06:00 | economic | | 8 | Monday night | Monday | 22:00 | Monday | 00:00 | economic | | 10 | Tuesday morning | Tuesday | 00:00 | Tuesday | 06:00 | economic | | 12 | Tuesday night | Tuesday | 22:00 | Tuesday | 00:00 | economic | | 14 | Wednesday morning | Wednesday | 00:00 | Wednesday | 06:00 | economic | | 16 | Wednesday night | Wednesday | 22:00 | Wednesday | 00:00 | economic | | 18 | Thursday morning | Thursday | 00:00 | Thursday | 06:00 | economic | | 20 | Thursday night | Thursday | 22:00 | Thursday | 00:00 | economic | | 22 | Friday morning | Friday | 00:00 | Friday | 06:00 | economic | | 24 | Friday night | Friday | 22:00 | Friday | 00:00 | economic | | 26 | Saturday | Saturday | 00:00 | Saturday | 00:00 | economic | | 28 | Saturday | Sunday | 00:00 | Sunday | 00:00 | economic | | 30 | Monday regular | Monday | 06:00 | Monday | 22:00 | regular | | 32 | Tuesday regular | Tuesday | 06:00 | Tuesday | 22:00 | regular | | 34 | Wednesday regular | Wednesday | 06:00 | Wednesday | 22:00 | regular | | 36 | Thursday regular | Thursday | 06:00 | Thursday | 22:00 | regular | | 38 | Friday regular | Friday | 06:00 | Friday | 22:00 | regular | +----+-------------------+-----------+-----------+-----------+---------+----------+ mysql> select \* from rate\_tariffs; +----+----------+----------+-------+----------+ | id | name | group\_id | price | currency | +----+----------+----------+-------+----------+ | 2 | economic | 1 | 15.30 | UTT | | 4 | economic | 3 | 23.40 | UTT | | 6 | economic | 5 | 29.70 | UTT | | 8 | regular | 1 | 18.00 | UTT | | 10 | regular | 3 | 27.00 | UTT | | 12 | regular | 5 | 34.20 | UTT | | 14 | economic | 7 | 3.00 | UTT | | 16 | regular | 7 | 4.00 | UTT | +----+----------+----------+-------+----------+

这是什么:它是一个调度程序,它应该根据当前的日期和时间选择要使用的关税。

我希望使用单个MySQL查询来获取这些信息。

到目前为止,我所拥有的,由于某种原因不能正常工作:

mysql> select scheduler.name, rate\_tariffs.name, scheduler.id, rate\_tariffs.id, CURTIME(), ( EXTRACT(HOUR\_MINUTE FROm CURTIME()) - REPLACE(hourstart,':',"")) as diff , daystart, hourstart,dayend,hourend from rate\_tariffs inner join scheduler on rate\_tariffs.name=tariff where daystart=DATE\_FORMAT(CURDATE(),'%W') and dayend=DATE\_FORMAT(CURDATE(),'%W') and (EXTRACT(HOUR\_MINUTE FROm CURTIME()) - REPLACE(hourstart,':',"")) >0 and ( REPLACE(hourend,':','') - EXTRACT(HOUR\_MINUTE FROM CURTIME())) >0 and group\_id=1; +------------------+----------+----+----+-----------+------+----------+-----------+----------+---------+ | name | name | id | id | CURTIME() | diff | daystart | hourstart | dayend | hourend | +------------------+----------+----+----+-----------+------+----------+-----------+----------+---------+ | Thursday morning | economic | 18 | 2 | 01:01:44 | 101 | Thursday | 00:00 | Thursday | 06:00 | +------------------+----------+----+----+-----------+------+----------+-----------+----------+---------+ 1 row in set (0.00 sec) mysql>

不幸的是,这并不总是起作用。

例如,星期三23:45分,它不起作用了。一小时后,同样的查询开始工作(显示在星期四)。

有什么想法可以让我的工作更好(实际上使它起作用)?在一个SQL查询中,还有其他方法可以做到吗?你还会用别的方式吗?

PS:这是表信息:

INSERT INTO `scheduler` VALUES (6,'Monday morning','Monday','00:00','Monday','06:00','economic'),(8,'Monday night','Monday','22:00','Monday','00:00','economic'),(10,'Tuesday morning','Tuesday','00:00','Tuesday','06:00','economic'),(12,'Tuesday night','Tuesday','22:00','Tuesday','00:00','economic'),(14,'Wednesday morning','Wednesday','00:00','Wednesday','06:00','economic'),(16,'Wednesday night','Wednesday','22:00','Wednesday','00:00','economic'),(18,'Thursday morning','Thursday','00:00','Thursday','06:00','economic'),(20,'Thursday night','Thursday','22:00','Thursday','00:00','economic'),(22,'Friday morning','Friday','00:00','Friday','06:00','economic'),(24,'Friday night','Friday','22:00','Friday','00:00','economic'),(26,'Saturday','Saturday','00:00','Saturday','00:00','economic'),(28,'Saturday','Sunday','00:00','Sunday','00:00','economic'),(30,'Monday regular','Monday','06:00','Monday','22:00','regular'),(32,'Tuesday regular','Tuesday','06:00','Tuesday','22:00','regular'),(34,'Wednesday regular','Wednesday','06:00','Wednesday','22:00','regular'),(36,'Thursday regular','Thursday','06:00','Thursday','22:00','regular'),(38,'Friday regular','Friday','06:00','Friday','22:00','regular'); INSERT INTO `rate\_tariffs` VALUES (2,'economic',1,'15.30','UTT'),(4,'economic',3,'23.40','UTT'),(6,'economic',5,'29.70','UTT'),(8,'regular',1,'18.00','UTT'),(10,'regular',3,'27.00','UTT'),(12,'regular',5,'34.20','UTT'),(14,'economic',7,'3.00','UTT'),(16,'regular',7,'4.00','UTT'); CREATE TABLE `scheduler` ( `id` int(3) NOT NULL AUTO\_INCREMENT, `name` varchar(30) DEFAULT NULL, `daystart` varchar(15) DEFAULT NULL, `hourstart` varchar(6) DEFAULT NULL, `dayend` varchar(15) DEFAULT NULL, `hourend` varchar(6) DEFAULT NULL, `tariff` varchar(16) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO\_INCREMENT=39 DEFAULT CHARSET=latin1; CREATE TABLE `rate\_tariffs` ( `id` int(3) NOT NULL AUTO\_INCREMENT, `name` varchar(25) DEFAULT NULL, `group\_id` int(3) DEFAULT NULL, `price` varchar(10) DEFAULT NULL, `currency` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO\_INCREMENT=17 DEFAULT CHARSET=latin1

谢谢你,丹

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-09 18:02:29

一些意见和建议。这会让它发挥作用的。

可以更容易地在MySQL中使用本机类型,特别是日期和时间。因此,我建议将开始/结束时间更改为time字段。如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE `scheduler` CHANGE `hourstart` `hourstart` TIME NULL DEFAULT NULL;
ALTER TABLE `scheduler` CHANGE `hourend` `hourend` TIME NULL DEFAULT NULL;

接下来,调度程序说时间从周四的晚上10点开始(例如),到周四的凌晨12点结束。上午12点,所以结束时间是在开始时间之前!因此,我们需要更改结束时间,使其大于开始时间(23:59:59)。此外,开始和结束时间重叠一秒钟。让每个部分通过减少1秒的结束时间来整齐地连接(而不是重叠)。将任何无效时间设置为午夜前1秒。如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UPDATE `scheduler` SET
hourend = SUBTIME(hourend, '00:00:01');

UPDATE `scheduler` SET
hourend = '23:59:59'
WHERE hourend < '00:00:00';

接下来,我们将调整SQL查询以使用我们的本机MySQL时间字段。唯一需要的更改是底部的两个WHERE语句。我们希望它检查时间是否介于开始和结束之间:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT scheduler.name, rate_tariffs.name, scheduler.id, rate_tariffs.id, CURTIME(), ( EXTRACT(HOUR_MINUTE FROm CURTIME())  - REPLACE(hourstart,':',"")) as diff , daystart, hourstart,dayend,hourend from rate_tariffs
INNER JOIN scheduler on rate_tariffs.name=tariff
WHERE daystart = DATE_FORMAT(CURDATE(),'%W')
    AND dayend = DATE_FORMAT(CURDATE(),'%W')
    AND CURTIME() >= hourstart
    AND CURTIME() <= hourend
    AND group_id = 1;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14249292

复制
相关文章
pandas DataFrame的创建方法
在pandas里,DataFrame是最经常用的数据结构,这里总结生成和添加数据的方法: ①、把其他格式的数据整理到DataFrame中; ②在已有的DataFrame中插入N列或者N行。
py3study
2020/01/19
2.6K0
pandas DataFrame的创建方法
Pandas DataFrame笔记
1.属性方式,可以用于列,不能用于行 2.可以用整数切片选择行,但不能用单个整数索引(当索引不是整数时) 3.直接索引可以使用列、列集合,但不能用索引名索引行  用iloc取行,得到的series:
用户1075292
2018/01/23
9740
Pandas DataFrame笔记
Pandas-3. DataFrame
Series组成的字典可以作为参数来创建DataFrame。其索引是所有Series的索引的并集。 例子:
悠扬前奏
2019/05/28
1.2K0
Pandas DataFrame 取整列
使用 df = pd.read_csv("csv_file.csv") 读出来的数据 就是 DataFrame 格式 ? <class 'pandas.core.frame.DataFrame'>
莫听穿林
2022/01/10
1.7K0
Pandas 如何创建 DataFrame
我们已经知道了什么是 Series,在使用 Series 之前,我们得知道如何创建 Series。
用户7886150
2020/12/26
1.6K0
pandas和spark的dataframe互转
由于pandas的方式是单机版的,即toPandas()的方式是单机版的,所以参考breeze_lsw改成分布式版本:
机器学习和大数据挖掘
2019/07/01
2.9K0
(六)Python:Pandas中的DataFrame
        DataFrame与Series相比,除了可以每一个键对应许多值之外,还增加了列索引(columns)这一内容,具体内容如下所示:
小点点
2022/12/12
3.9K0
合并Pandas的DataFrame方法汇总
Pandas是数据分析、机器学习等常用的工具,其中的DataFrame又是最常用的数据类型,对它的操作,不得不熟练。在《跟老齐学Python:数据分析》一书中,对DataFrame对象的各种常用操作都有详细介绍。本文根据书中介绍的内容,并参考其他文献,专门汇总了合并操作的各种方法。
老齐
2021/03/11
5.7K0
python pandas dataframe函数_Python Pandas dataframe.ne()用法及代码示例
Python是进行数据分析的一种出色语言,主要是因为以数据为中心的python软件包具有奇妙的生态系统。 Pandas是其中的一种,使导入和分析数据更加容易。
用户7886150
2021/01/16
1.6K0
使用Pandas melt()重塑DataFrame
重塑 DataFrame 是数据科学中一项重要且必不可少的技能。在本文中,我们将探讨 Pandas Melt() 以及如何使用它进行数据处理。
deephub
2022/01/21
3K0
使用Pandas melt()重塑DataFrame
Pandas DataFrame 数据合并、连接
merge 通过键拼接列 pandas提供了一个类似于关系数据库的连接(join)操作的方法merage,可以根据一个或多个键将不同DataFrame中的行连接起来 语法如下:
马哥Python
2019/06/27
3.4K0
[869]pandas的dataFrame的行列索引操作
这里的index的索引列是从0开始的,那么现在我想要让它从1开始怎么做? 我搜了几篇文章,发现有的是:
周小董
2020/07/21
1.5K0
pandas中的 fillna使用(pandas.DataFrame.fillna)「建议收藏」
3、将“A”、“B”、“C”和“D”列中的所有 NaN 元素分别替换为 0、1、2 和 3。
全栈程序员站长
2022/09/22
3.5K0
pandas中的 fillna使用(pandas.DataFrame.fillna)「建议收藏」
Pandas DataFrame创建方法大全
Pandas是Python的数据分析利器,DataFrame是Pandas进行数据分析的基本结构,可以把DataFrame视为一个二维数据表,每一行都表示一个数据记录。本文将介绍创建Pandas DataFrame的6种方法。
用户1408045
2019/09/17
5.8K0
Pandas DataFrame创建方法大全
Pandas高级教程之:Dataframe的合并
Pandas提供了很多合并Series和Dataframe的强大的功能,通过这些功能可以方便的进行数据分析。本文将会详细讲解如何使用Pandas来合并Series和Dataframe。
子润先生
2021/06/18
2.3K0
Pandas DataFrame的基本属性详解
df = pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False) 创建一个DataFrame
全栈程序员站长
2022/08/22
1.3K0
Pandas DataFrame的基本属性详解
如何遍历pandas当中dataframe的行
现在需要遍历上面DataFrame的行。对于每一行,都希望能够通过列名访问对应的元素(单元格中的值)。也就是说,需要类似如下的功能:
马哥Python
2019/06/27
4K0
pandas dataframe的合并(append, merge, concat)
创建2个DataFrame:>>>df1=pd.DataFrame(np.ones((4,4))*1,columns=list('DCBA'),inde
Java架构师必看
2021/12/24
2.9K0
Pandas高级教程之:Dataframe的合并
Pandas提供了很多合并Series和Dataframe的强大的功能,通过这些功能可以方便的进行数据分析。本文将会详细讲解如何使用Pandas来合并Series和Dataframe。
程序那些事
2021/06/14
5.3K0
点击加载更多

相似问题

Pandas Dataframe -速率计算

116

计算Pandas Dataframe的整列

112

从pandas DataFrame计算pvalue

14

从Pandas DataFrame计算IDF

12

Pandas dataframe的群内计算

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文