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

Sha*_*ati 4 mysql sql datetime

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

31-12-17 23:59:00
30-11-17 23:59:00 
Run Code Online (Sandbox Code Playgroud)

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

Rav*_*avi 12

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

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';
Run Code Online (Sandbox Code Playgroud)

详细说明:

所以,基本上,以获得正确的行,我们需要得到该月的最后一天 一天中的最后一分钟

LAST_DAY将帮助用于获取给定日期时间的月份的最后一天.而且DATE_FORMAT将有助于获取日期.现在,我们将它们组合在一起,以获得给定日期时间的最后日期.

DATE_FORMAT(LAST_DAY(<date_time_col>),"%d")
Run Code Online (Sandbox Code Playgroud)

29如果是月份的最后一天,则上面将返回29-02-2018.

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

DATE_FORMAT(<date_time_col>,"%H:%i")
Run Code Online (Sandbox Code Playgroud)

23:59如果给定日期时间,则上面将返回29-02-2018 23:59:00.


Gio*_*sos 5

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

SELECT LAST_DAY(mydate)
Run Code Online (Sandbox Code Playgroud)

收益:

2031-12-31
2030-11-30
Run Code Online (Sandbox Code Playgroud)

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

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

收益:

last_min
--------------------
2031-12-31T23:59:00Z
2030-11-30T23:59:00Z
2030-11-30T23:59:00Z
Run Code Online (Sandbox Code Playgroud)

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

如果您想获取日期时间在最后一分钟间隔内的记录,那么您还可以使用DATE_ADD以获取上述日期时间值的下一分钟:

SELECT DATE_ADD(last_min, 
                INTERVAL 1 MINUTE) AS next_min
Run Code Online (Sandbox Code Playgroud)

收益:

next_min
---------------------
2032-01-01T00:00:00Z
2030-12-01T00:00:00Z
2030-12-01T00:00:00Z
Run Code Online (Sandbox Code Playgroud)

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

在这里演示