Mysql 在sql中使用中间值时AM/PM不工作

Mysql 在sql中使用中间值时AM/PM不工作,mysql,sql,Mysql,Sql,我有一个名为任务的表: id t_started_on t_due_on ------------------------------------------------ 1 2018-01-12 10:45 AM 2018-01-12 07:45 PM 2 2018-01-18 09:15 AM 2018-01-19 07:00 PM 3 2018-01-16 02:30 AM 2018-01-22 10:30

我有一个名为
任务
的表:

id     t_started_on              t_due_on
------------------------------------------------    
 1    2018-01-12 10:45 AM    2018-01-12 07:45 PM
 2    2018-01-18 09:15 AM    2018-01-19 07:00 PM
 3    2018-01-16 02:30 AM    2018-01-22 10:30 AM
我想选择今天的日期介于两个日期字段之间的记录(AM或PM)。如果没有AM/PM,我知道怎么做,但我的AM/PM要求如下:

除了日期比较外,时间部分本身也应介于开始日期的时间部分和到期日期的时间部分之间

我该怎么做

如果当前时间戳为“2018-01-19 03:56 PM”,而不是dabase中的上述数据,则结果应该只有一行(第二行),但我在结果中得到两行(也是第三行)

这是我的SQL查询

SELECT * 
FROM `task` 
WHERE  '2018-01-19 03:56 PM' between t_started_on and t_due_on

不应包括第三行,因为到期日期的时间部分早于当前时间的时间部分。

您最好将日期存储为
DATETIME
。由于您有这些值,它已经显示您的数据库字段不是
date
类型,因为将这些字符串插入
date
字段不会产生错误

如果无法更改,则可以使用
STR\u to\u DATE
功能:

SELECT * 
FROM `task` 
WHERE t_status !=3 
AND   STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p') BETWEEN
        STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p') AND 
        STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p')
但这确实是一个低劣的解决方案

尽管如此,你期望只得到一排似乎很奇怪。当然,第三行符合要求,因为开始/到期日期在您要检查的日期之前/之后,与时间部分无关

补遗 在评论中,你说你想应用不同的逻辑。我猜您希望分别比较日期和时间组件,并且两者都符合
之间的
条件。这确实应该在问题中加以解释,因为目前没有具体说明

在这种情况下,您可以使用
DATE\u格式
仅提取时间部分,并使用该格式重复该条件:

SELECT *,
       STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p'),
       STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p'),
       STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p')
FROM `task` 
WHERE t_status !=3 
AND   STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p') BETWEEN
        STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p') AND 
        STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p')
AND   DATE_FORMAT(STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p'), '%h:%i') BETWEEN
        DATE_FORMAT(STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p'), '%h:%i') AND 
        DATE_FORMAT(STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p'), '%h:%i')

此查询将从结果中排除第3行。

您需要在字符串文本中使用24小时时间。我得到了正确的输出。状态有问题=3'. 检查一下@Sobmac,对不起,兄弟,我忘了给t_状态(列名)我已经严格编辑了你的问题来解释时间要求。请检查它是否反映了您想要的。不,回答不正确,它是来了两排只有兄弟三排也符合条件。第三行的开始日期为1月16日,结束日期为1月22日。显然,1月19日处于这两者之间,无论时间如何。如果你还指望别的,我一定是误解了你的问题。注:我不是你的broCheck am/PM条件不匹配,我的日期第三排有am,但我们正在检查PM(2018-01-19 03:56 PM),这意味着第三排不应该出现我知道有am/PM,但当时间在不同的日期时,无论是am还是PM都无关紧要。2018年1月22日总是晚于2018年1月19日,无论您查看的是上午还是下午时间,都不会改变这一点。我只想获取上午记录,这意味着在两个日期之间,下午记录不应该出现trincot先生