2017-03-07 74 views
-1

我在一列中保存多个日期在数据库分开用逗号(,)像如何将当前日期与MySQL中的日期范围或离散日期值进行比较?

  1. 2017年3月5日,2017年3月6日,2017年3月7日,2017年3月8日,2017年-03-08。
  2. 2017年3月5日,2017年3月8日

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

任何人都可以帮我.... ....?

谢谢...

+3

不要保存CSV在列http://stackoverflow.com/questions/41304945/best-type-of-indexing-when-there-is-like-clause/41305027#41305027 http:// stackoverflow。 com/questions/41215624/sql-table-with-list-entry-vs-sql-table-with-a-row-for-each-entry/41215681#41215681 – e4c5

+1

这不是你应该如何存储你的数据。规范化表格。 http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-that-bad我也不清楚如何示例1很容易,但2不是.. – chris85

+0

你需要做什么确切的比较? –

回答

0

,如果我,我肯定会用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) 
    ); 
2

您可以使用FIND_IN_SET与逗号比较CURRENT_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()返回的位置如果字符串在字符串列表中存在(作为子字符串),那么对于第二个字符串它简单地返回的Zero

,所以你可以做一些事情像下面

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

我可以用第一个例子,第二个是什么。 – GYaN

+0

那么你是在谈论缺失的数据? – sumit

+0

请参阅编辑..... – sumit

-1
<?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>'; 
} 
?> 
2

使用FIND_IN_SET

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

正如其他人评论说,这将是最好标准化数据和存储个别日期在链接表的多行中而不是在单个字段中。不过,假设有一个有效的原因,这不能做,下面会做你问:

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

+0

好的...感谢您的帮助 – GYaN

+0

在您的答案船上! –

相关问题