如何将当前日期与MySQL中的日期范围或离散日期值进行比较?

如何将当前日期与MySQL中的日期范围或离散日期值进行比较?,mysql,sql,csv,date,Mysql,Sql,Csv,Date,我在数据库中用逗号(,)分隔的一列中保存多个日期,如 2017-03-052017-03-062017-03-072017-03-082017-03-08 2017-03-052017-03-08 我只是想知道我是如何用这些日期来比较当前日期的。在第一个例子中,这很容易,但问题在于第二个 有人能帮我吗 谢谢 您可以使用FIND_IN_SET将当前日期与逗号分隔的日期进行比较 日期 编辑 MySQL FIND_IN_SET()返回字符串在字符串列表中的位置(作为子字符串),因此对于第二个集合,它简

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

  • 2017-03-052017-03-062017-03-072017-03-082017-03-08
  • 2017-03-052017-03-08
  • 我只是想知道我是如何用这些日期来比较当前日期的。在第一个例子中,这很容易,但问题在于第二个

    有人能帮我吗

    谢谢

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

    编辑

    MySQL FIND_IN_SET()返回字符串在字符串列表中的位置(作为子字符串),因此对于第二个集合,它简单地返回零

    所以你可以做下面的事情

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


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

    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'
    
    选择日期\u csv,
    当字符长度(替换(日期“,”和“)=字符长度(日期“)-1时的情况
    那么/*date\u csv只有一个逗号*/
    当前日期>=子字符串(日期csv,1,仪表(日期csv,,)-1)
    和当前日期0
    以“测试结果”结束
    

    Rextester演示:

    如果我有这么糟糕的数据结构,我肯定会使用
    在集合中查找()和
    子字符串索引()

    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)
          );
    

    不要将CSV保存在列中这不是存储数据的方式。使表正常化。我也不清楚示例1如何简单,但示例2却不简单。您需要进行什么样的精确比较?因此,据我所知,有两种情况:如果正好有两个日期,则应测试当前日期,看看它是否在这些日期定义的范围内。否则,应将当前日期与任何单个日期进行比较,以获得精确匹配。这是正确的吗?是的。。。。这就是我想要的…我可以用第一个例子,第二个例子。那么你说的是缺失数据吗?不缺失数据首先是周末批次(每天的日期)。第二个是每日批次(仅第一个和最后一个日期)@Gyandepsharma不要这样做。相反,修复损坏的模式。好的。。。谢谢你在船上的帮助和你的答案!
     SELECT * FROM your_table
     WHERE FIND_IN_SET('2017-03-08',comma_date );
    
    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'
    
    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)
          );