MySQL比较未知类型

时间:2017-01-27 21:36:20

标签: mysql datetime

这听起来很简单,但我被卡住了。我想要的是能够比较两个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规范)。有什么想法吗?

2 个答案:

答案 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()功能。