2013-09-23 62 views
4

MySQL是否提供驗證日期有效性的函數?例如,在提供無效日期2013-02-30時,DATE函數返回NULL。但是,我也同時使用STR_TO_DATE,這會神祕地阻止DATE正常工作。MySQL日期有效性

SELECT DATE('2013-02-30'); NULL 
SELECT STR_TO_DATE('2013-02-30', '%Y-%m-%d'); NOT NULL 
SELECT DATE('2013-02-40'); NULL 
SELECT STR_TO_DATE('2013-02-40', '%Y-%m-%d'); NULL 
SELECT DATE(STR_TO_DATE('2013-02-30', '%Y-%m-%d')); NOT NULL 

爲什麼STR_TO_DATE停止DATE的功能,並且有一些變通方法,以驗證是否使用日期STR_TO_DATE(這我有義務用)時是有效的?

我曾在其間的答案跌跌撞撞:顯然DATE功能跳過一些驗證檢查,當數據類型已經是「日期」(STR_TO_DATE將字符串轉換爲日期數據類型)的。因此,在將日期解析爲與STR_TO_DATE正確的格式之後將日期轉換爲字符串,是否有訣竅:

@valid_date = NOT ISNULL(DATE(CONVERT(STR_TO_DATE('2013-02-29', '%Y-%m-%d'), CHAR)))

+0

中的格式a priori請提供更多的上下文:您嘗試驗證的數據流是什麼? – wallyk

+0

@wallyk可以任意格式化的日期應該首先傳遞給STR_TO_DATE函數及其格式,並且應該有效驗證其有效性。剛剛解決了問題,請參閱編輯。 – user2180613

+0

如果您從某個數據庫字段中提取日期,則您已經知道它是NULL或有效。你爲什麼要驗證它? – wallyk

回答

0

我不明白你的目的,也許這是一個想法;
SELECT DATE_FORMAT(yourFiled,'%Y-%m-%d')days FROM yourTable GROUP GROUP BY days; 這不是null;你可以改變它。有的喜歡

SELECT DATE_FORMAT(yourFiled, '%Y-%m-%d') days FROM yourTable WHERE yourFiled > '2013-9-23 00:00:00' GROUP By days; 
0

試試這個:

SELECT DATE(STR_TO_DATE('2013-00-30', '%Y-%m-%d')); --is also NOT NULL

1

這是非常困難的驗證,如果一個字段是因爲,將需要考慮到所有可能的不同日期格式的日期。但如果你知道該字段日期格式是其中之一:

'yyyy-mm-dd' 
'yyyy-mm-dd hh:mm:ss' 
'yyyy-mm-dd whatever' 

此代碼將幫助您:

SELECT count(*) FROM `table` 
WHERE DATE(STR_TO_DATE(`column`, '%Y-%m-%d')) IS NOT NULL 
AND `column` NOT REGEXP '^[0-9\.]+$' 

基本上是:

  • 的第一個條件告訴你,如果是日期,但不幸的是並不排除數字(例如:DATE(STR_TO_DATE(**1**, '%Y-%m-%d')) = '2001-00-00'
  • 第二個確保數字排除在外,這隻會讓您的日期只有臨時按照上面的格式。

如果count(*)>0那麼它是一個日期,如果是0這是別的東西。

注意 這種方法,只要你知道適用於任何日期格式的字符串事先他們遵循什麼樣的格式(這是我所知道的是並非總是如此,但仍然有用)。只需更換STR_TO_DATE