【问题标题】:How to compare date object in mysql against two string dates? [duplicate]如何将mysql中的日期对象与两个字符串日期进行比较? [复制]
【发布时间】:2021-03-27 20:59:33
【问题描述】:

我正在尝试比较以下内容:

SELECT g_m.user_id
     , g_m.group_id 
  FROM Group_Members g_m 
 WHERE g_m.gender_id = 2 
   AND g_m.partner_gender_id = 1 
   AND g_m.birthday >= '01-01-1955' 
   AND g_m.birthday <= '12-31-2002' 
   AND g_m.user_id != 12

在这种情况下,g_m.birthday 应该显示为 '02-15-1998',但这会返回一个空数组,因为日期比较似乎不准确?

这是整个函数,日期是从用户带来的最小年龄和最大年龄传递的。

var today = new Date();

var minYear = "01-01-" + (today.getFullYear() - userPref.age_max); //min year to start but oldest age
var maxYear = "12-31-" + (today.getFullYear() - userPref.age_min); //max year to end but youngest age
var qSelect = "SELECT g_m.user_id, g_m.group_id" +
                        " FROM Group_Members g_m WHERE g_m.gender_id = ? AND g_m.partner_gender_id = ?" +
                       " AND g_m.birthday >= STR_TO_DATE(?, '%m/%d/%Y') AND g_m.birthday <= STR_TO_DATE(?, '%m/%d/%Y')" + 
                        " AND g_m.user_id != ?";
  var qValues = [userPref.partner_gender_id, userObj.gender_id, minYear, maxYear, userObj.id];

有人知道如何在 mysql 查询中比较日期吗?

【问题讨论】:

  • 日期比较正常,但您正在比较字符串。
  • 所以我需要将查询中的日期转换为实际日期ok
  • 使用日期数据类型存储日期(或者不要使用 RDBMS)。然后回复我们。
  • 嗨,请看我上面的更新,我正在使用年龄范围来构建日期,而使用 strtodate 它不起作用。
  • 它不起作用,因为您的格式字符串看起来错误。也许在您的问题中添加一些示例数据。

标签: mysql sql


【解决方案1】:

正如 cmets 已经指出的那样,您似乎将日期存储为实际文本。对于短期解决方法,您可以使用STR_TO_DATE 将您的文本日期转换为真正的 MySQL 日期。然后,将它们与有效的 MySQL 日期文字进行比较:

SELECT
    g_m.user_id,
    g_m.group_id
FROM Group_Members g_m 
WHERE
    g_m.gender_id = 2 AND 
    g_m.partner_gender_id = 1 AND
    STR_TO_DATE(g_m.birthday, '%m-%d-%Y') >= '1955-01-01' AND
    STR_TO_DATE(g_m.birthday, '%m-%d-%Y') < '2003-01-01' AND
    g_m.user_id != 12;

从长远来看,您应该将生日列设为日期时间或时间戳。

旁注:我已经重写了日期范围,以包括出生于 1955 年至 2002 年的日历年,包括两端。

【讨论】:

  • 我尝试了这个但仍然没有得到任何回报,请参阅上面的更新,我正在使用年龄范围来构建日期,并且使用 strtodate 它不起作用。
  • 我的查询是正确的(顺便说一句,您在编辑的问题中没有使用它),问题是您的数据,而不是我的答案。
  • 好的,如果我将它切换到日期时间,那么我将如何更改查询,我宁愿解决长期问题
  • 我已经回答了你的问题。这个网站不是这样工作的,你不断地改变问题,然后每个人都跳舞。如果您需要其他方面的帮助,请提出一个新问题。
  • 好的,抱歉,会问一个新问题,然后感谢您的帮助
【解决方案2】:

您的日期的数据类型是什么?您应该将它们声明为“日期”,否则您将无法比较它们。 带字符串,'02-15-1998'

加上日期,你的mysql请求应该是:

SELECT g_m.user_id, g_m.group_id FROM Group_Members g_m WHERE g_m.gender_id = 2 AND g_m.partner_gender_id = 1 AND g_m.birthday >= '1955-01-01' AND g_m.birthday <= '2002-12-31' AND g_m.user_id != 12

对不起我的英语,我是法国人......

【讨论】:

  • 嗨,请看我上面的更新,我正在使用年龄范围来构建日期,而使用 strtodate 它不起作用。
猜你喜欢
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多