Mysql 如何获取每个月最后一分钟的行数?
我有一个表,其中一列名为“date”,类型为Mysql 如何获取每个月最后一分钟的行数?,mysql,sql,datetime,Mysql,Sql,Datetime,我有一个表,其中一列名为“date”,类型为DATETIME。我需要选择其日期为一个月最后一分钟的所有行,例如: 31-12-17 23:59:00 30-11-17 23:59:00 如何在一个查询中实现这一点 您可以使用获取当月的最后一天,并使用获取比较时间 SELECT * FROM <table_name> WHERE DATE_FORMAT(LAST_DAY(<date_time_col>),"%d")=DATE_FORMAT(<date_time_
DATETIME
。我需要选择其日期为一个月最后一分钟的所有行,例如:
31-12-17 23:59:00
30-11-17 23:59:00
如何在一个查询中实现这一点 您可以使用获取当月的最后一天,并使用获取比较时间
SELECT * FROM <table_name>
WHERE DATE_FORMAT(LAST_DAY(<date_time_col>),"%d")=DATE_FORMAT(<date_time_col>,"%d")
AND DATE_FORMAT(<date_time_col>,"%H:%i")='23:59';
如果该月的最后一天是2018年2月29日,则上述将返回29
现在,我们需要检查,给定的日期时间是否有一天的最后一分钟?我们可以再次使用DATE\u格式
从给定的日期时间中提取时间。在这里,我们将只关注小时和分钟(根据OP问题)。所以,应该是这样
DATE_FORMAT(<date_time_col>,"%H:%i")
DATE\u格式(,%H:%i)
如果给定的日期时间是2018年2月29日23:59:00,则上述将返回23:59
SELECT * FROM table WHERE DATE(date) = LAST_DAY(date) AND HOUR(date) = 23 AND MINUTE(date) = 59;
由于此查询不使用任何索引,因此在大型表中可能会比较慢。您可以使用此查询获取每个月的最后一天:
SELECT LAST_DAY(mydate)
SELECT STR_TO_DATE(CONCAT(LAST_DAY(mydate),
' ',
'23:59:00'),
'%Y-%m-%d %H:%i:%s') AS last_min
返回:
2031-12-31
2030-11-30
last_min
--------------------
2031-12-31T23:59:00Z
2030-11-30T23:59:00Z
2030-11-30T23:59:00Z
next_min
---------------------
2032-01-01T00:00:00Z
2030-12-01T00:00:00Z
2030-12-01T00:00:00Z
然后使用以获取每月最后一天的最后一分钟:
SELECT LAST_DAY(mydate)
SELECT STR_TO_DATE(CONCAT(LAST_DAY(mydate),
' ',
'23:59:00'),
'%Y-%m-%d %H:%i:%s') AS last_min
返回:
2031-12-31
2030-11-30
last_min
--------------------
2031-12-31T23:59:00Z
2030-11-30T23:59:00Z
2030-11-30T23:59:00Z
next_min
---------------------
2032-01-01T00:00:00Z
2030-12-01T00:00:00Z
2030-12-01T00:00:00Z
您现在可以使用last_min
与实际日期时间值进行比较
如果要获取日期时间在最后一分钟间隔内的记录,还可以使用获取上述日期时间值的下一分钟:
SELECT DATE_ADD(last_min,
INTERVAL 1 MINUTE) AS next_min
返回:
2031-12-31
2030-11-30
last_min
--------------------
2031-12-31T23:59:00Z
2030-11-30T23:59:00Z
2030-11-30T23:59:00Z
next_min
---------------------
2032-01-01T00:00:00Z
2030-12-01T00:00:00Z
2030-12-01T00:00:00Z
使用上述表达式,您可以构建一个谓词来检查所需时间间隔内的日期
更有效的解决方案如下:
SELECT * FROM mytable WHERE mydate IN
(
'2017-01-31 23:59:00',
'2017-03-31 23:59:00',
'2017-04-30 23:59:00',
'2017-05-31 23:59:00',
'2017-06-30 23:59:00',
'2017-07-31 23:59:00',
'2017-08-31 23:59:00',
'2017-09-30 23:59:00',
'2017-10-31 23:59:00',
'2017-11-30 23:59:00',
'2017-12-31 23:59:00'
)
OR mydate = '2017-03-01 00:00:00'- INTERVAL 1 MINUTE;
我猜您这样做是为了允许在'01-12-17 00:00:00'和'31-12-17 23:59:00'之间出现
列。
?如果是这样,那就不要这样做。如果您使用a_列>='01-12-17 00:00:00'和a_列<'01-01-18 00:00:00'
如果代码更少,请参阅@草莓-这不会阻止索引的潜在使用吗?那么这是个坏主意吗?@MatBailie如果OP想要对应于每个月最后一分钟的行,那么我看他们没有太多的选择(除了包括所有可能的永久站点——毕竟只有12个)@MatBailie实际上你的猜测是错的:我只需要获取日期是一个月最后一分钟的行。如果它导致索引问题,我可能需要找到另一个解决方案。您知道吗?将搜索列放在这些函数中会阻止使用索引。“这通常是个坏主意。”马特贝利我明白,解决每个问题总有多种方法。但是,根据OP问题,我认为没有任何解决方案可以在不使用任何函数的情况下解决这个问题。@Ravi,您可能无法找到不使用函数的解决方案,但我认为您仍然可以找到使用索引的解决方案。