2017-03-07 76 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

在您的答案船上! –

相關問題