如何获得每个月最后一分钟的行?

时间:2018-01-21 07:43:47

标签: mysql sql datetime

我有一个表,其中一个名为'date'的列属于DATETIME类型。我需要选择其日期是一个月的最后一分钟的所有行,例如:

31-12-17 23:59:00
30-11-17 23:59:00 

如何在一个查询中实现此目的?

4 个答案:

答案 0 :(得分:12)

您可以使用 LAST_DAY 来获取该月的最后一天,并使用 DATE_FORMAT 来获取比较时间。

channel.fetchMessages()
.then(messages => messages.array().forEach(
    message => message.author.equals(client.user) && message.delete()
));

详细说明:

所以,基本上,为了获得正确的行,我们需要获得一个月的最后一天 AND 当天的最后一分钟 < / p>

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'; 将有助于获取给定日期时间的月份的最后一天。 LAST_DAY将有助于获取日期。现在,我们将它们组合在一起,以获得给定日期时间的最后日期

DATE_FORMAT

如果该月的最后一天为DATE_FORMAT(LAST_DAY(<date_time_col>),"%d") ,则上方将返回29

现在,我们需要检查,如果给定的日期时间是当天的最后一分钟?我们可以再次使用29-02-2018从给定的日期时间中提取时间。在这里,我们只关注小时和分钟(根据OP问题)。所以,它应该是

DATE_FORMAT

如果给定的日期时间为DATE_FORMAT(<date_time_col>,"%H:%i") ,则上方将返回23:59

答案 1 :(得分:5)

您可以使用LAST_DAY来获取每个月的最后一天:

SELECT LAST_DAY(mydate)

返回:

2031-12-31
2030-11-30

然后使用STR_TO_DATE获取每个月最后一天的最后一分钟:

SELECT STR_TO_DATE(CONCAT(LAST_DAY(mydate), 
                   ' ', 
                   '23:59:00'),
                   '%Y-%m-%d %H:%i:%s') AS last_min

返回:

last_min
--------------------
2031-12-31T23:59:00Z
2030-11-30T23:59:00Z
2030-11-30T23:59:00Z

现在,您可以使用last_min与实际日期时间值进行比较。

如果您想获取日期时间 interval 的记录,那么您还可以使用DATE_ADD获取上述日期时间值:

SELECT DATE_ADD(last_min, 
                INTERVAL 1 MINUTE) AS next_min

返回:

next_min
---------------------
2032-01-01T00:00:00Z
2030-12-01T00:00:00Z
2030-12-01T00:00:00Z

使用上面的表达式,您可以构建一个谓词,用于检查所需时间间隔内的日期。

Demo here

答案 2 :(得分:1)

SELECT * FROM table WHERE DATE(date) = LAST_DAY(date) AND HOUR(date) = 23 AND MINUTE(date) = 59;

由于此查询不会使用任何索引,因此在大型表中可能会很慢。

答案 3 :(得分:0)

更有效的解决方案如下:

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;