【问题标题】:How to compare current date with a date range or discrete date values in MySQL?如何将当前日期与 MySQL 中的日期范围或离散日期值进行比较?
【发布时间】:2017-03-07 04:47:35
【问题描述】:

我将数据库中的多个日期保存在一列中,用逗号(,)分隔

  1. 2017-03-05、2017-03-06、2017-03-07、2017-03-08、2017-03-08。
  2. 2017-03-05, 2017-03-08

我只想知道我如何通过这些日期比较当前日期。在第一个例子中,它很容易,但问题在于第二个例子。

谁能帮帮我....?

谢谢...

【问题讨论】:

  • 这不是您应该存储数据的方式。规范化表格。 stackoverflow.com/questions/3653462/… 我也不清楚示例 1 有多简单,但示例 2 不是..
  • 你需要做哪些准确的比较?
  • 据我了解,有两种情况:如果恰好有两个日期,则应测试当前日期以查看它是否在这些日期定义的范围之间。否则,应将当前日期与任何单个日期进行比较,以确保完全匹配。这是正确的吗?
  • 是的……这就是我想要的……

标签: mysql sql csv date


【解决方案1】:

正如其他人所评论的那样,最好将数据标准化并将各个日期存储在链接表的多行中,而不是存储在单个字段中。但假设有正当理由无法做到这一点,以下将按照您的要求进行:

SELECT date_csv,
       CASE WHEN CHAR_LENGTH(REPLACE(date_csv, ',', '')) = CHAR_LENGTH(date_csv) - 1
            THEN /* date_csv has a single comma */
                 CURRENT_DATE >= SUBSTRING(date_csv, 1, INSTR(date_csv, ',') - 1)
                 AND CURRENT_DATE <= SUBSTRING(date_csv, INSTR(date_csv, ',') + 1)
            ELSE /* date_csv has either no comma or multiple commas */
                 FIND_IN_SET(DATE_FORMAT(CURRENT_DATE,'%Y-%m-%d'), date_csv) > 0
       END AS 'Test result'

Rextester 演示: http://rextester.com/EPKO65812

【讨论】:

  • 好的...感谢您的帮助
  • 带着你的答案加入!
【解决方案2】:

使用FIND_IN_SET

 SELECT * FROM your_table
 WHERE FIND_IN_SET('2017-03-08',comma_date );

【讨论】:

    【解决方案3】:

    您可以使用FIND_IN_SETCURRENT_DATE 与您的逗号分隔进行比较 日期

    SELECT FIND_IN_SET(CURRENT_DATE,'2017-03-05,2017-03-06,2017-03-07,2017-03-08,2017-03-08');  
    

    编辑

    如果字符串列表中存在(作为子字符串)字符串,MySQL FIND_IN_SET() 返回字符串的位置,因此对于您的第二组,它简单地返回零

    所以你可以做一些像下面这样的事情

     SELECT * from tbl where FIND_IN_SET(CURRENT_DATE,'2017-03-05,2017-03-08')>0
    

    【讨论】:

    • 我可以使用第一个例子,第二个例子。
    • 那么您是在说丢失数据吗?
    • 不丢失数据首先是周末批次(每天的日期)。其次是每日批次(只有第一个和最后一个日期)
    • @GyandeepSharma 不要这样做。相反,请修复损坏的架构。
    【解决方案4】:

    如果我有这么糟糕的数据结构,我肯定会使用find_in_set()substring_index()

    select t.*
    from t
    where find_in_set(date_format(curdate(), '%Y-%m-%d'), datecol) > 0 or
          (datecol like '%,%' and datecol not like '%,%,%' and
           date_format(curdate(), '%Y-%m-%d') between substring_index(datecol, ',', 1) and substring_index(datecol, ',', -1)
          );
    

    【讨论】:

      【解决方案5】:
      <?php
      
      $string_date='2017-03-05,2017-03-06,2017-03-07,2017-03-08,2017-03-08';
      $tmp_dates=explode(',',$string_date);
      
      foreach($tmp_dates as $tmp_date)
      {
      $newDateString = date_format(date_create_from_format('Y-m-d', $tmp_date), 'Y-m-d');
      
      $interval =date_diff(date_create($newDateString),date_create(date('Y-m-d')));
      echo $interval->format('%R%a days');
      echo '<br>';
      }
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        • 2017-08-26
        • 1970-01-01
        • 2016-07-24
        • 2017-05-15
        • 1970-01-01
        相关资源
        最近更新 更多