这听起来很简单,但我被卡住了。我想要的是能够比较两个MySQL DATETIME值,但由于查询形成的开放性质,我不知道值1或值2的数据类型。例如,每个值可以是一个字符串,由最终用户,日期字段或DATETIME字段输入。
示例:
dateTime1> 2017年1月18日下午2:30
我遇到的问题是STR_TO_DATE()需要一个字符串并使用DATETIME返回null,DATE_FORMAT()需要一个日期并使用字符串返回null。我需要一个函数或嵌套的函数组,无论数据类型的值如何,我都会得到相同的结果。想直接在mysql中解决,而不是预处理或使用户输入验证更严格。我曾经使用过CAST(value,DATETIME),但是CAST()在最近的MySQL版本中没有正确读取日期(它忽略了am / pm规范)。有什么想法吗?
答案 0 :(得分:1)
GREATEST()对我不起作用,因为如果任何组件为null,它总是返回null,但是它引导我到COALESCE(),这为我提供了我正在寻找的解决方案,因为它返回第一个非NULL值。它假设值将始终为DATE,DATETIME或日期时间字符串,这是我的问题:
SELECT COALESCE(STR_TO_DATE(value1,'%c /%e /%Y%r'),value1)> COALESCE(STR_TO_DATE(value2,'%c /%e /%Y%r'),value2)
注意:value1和value2是DATE / DATETIME列或日期时间字符串值
答案 1 :(得分:0)
您可以考虑使用coalesce()
函数,以及str_to_date()
使用的不同格式列表。 coalesce()
将忽略列表中的任何null(但至少其中一个应为非null,或者仍然为null)。
select
coalesce(
str_to_date('13/18/2017 2:30pm', '%m/%e/%Y %l:%i%p') -- will get a null
, str_to_date('18/13/2017 2:30pm', '%e/%m/%Y %l:%i%p') -- will get a null
, str_to_date('18/01/2017 14:30', '%e/%m/%Y %k:%i')
) as answer;
代码可能很脆弱,因为人类用户可能会输入许多不同的日期/时间格式。
您可能还需要非常熟悉str_to_date()
所采用的所有不同格式字符。有关详细信息,请参阅本手册页:
https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format
<强>更新强>
此答案的早期版本错误地建议使用greatest()
功能。