2010-12-20 96 views
1

我正在設置一個腳本,以便每日運行並檢查是否滿足特定年齡的成員 - 可以在CMS中設置自動發送的電子郵件,並將其分配給任何年齡的用戶,可以在幾個月或幾年內發送。爲了通過PHP和MySQL來處理這個問題,將月數作爲參數傳遞給一個方法,我將如下處理它。但是,我不確定我是以最簡單的方式來解決這個問題的!部分原因是由於英國日期格式的格式化,我將字符串轉換爲日期時間轉換爲unix時間戳以進行比較。 任何人都可以找到一個更好的方式去做這件事嗎?由於MySQL日期比較建議

 // If num of months provided is a year, make calculation based on exact year 
     if ($age_in_months % 12 == 0) 
     { 
      // Using 365 days here (60 * 60 * 24 * 365 = 3153600) 
      $clause = 'WHERE ROUND((UNIX_TIMESTAMP() - UNIX_TIMESTAMP(STR_TO_DATE(dob, "%d/%m/%Y")))/31536000) = ' . $age_in_months; 
     } 
     else 
     { 
      // Using 30 days as avg month length (60 * 60 * 24 = 86400) - convert months to days 
      $clause = 'WHERE ROUND((UNIX_TIMESTAMP() - UNIX_TIMESTAMP(STR_TO_DATE(dob, "%d/%m/%Y")))/86400) = ' . $age_in_months * 30; 
     } 
+0

不要傻瓜,以適當的格式存儲日期。這就是你必須先做的。 – 2010-12-20 20:15:26

+0

查看下面的評論,我堅持在這裏的日期存儲格式 – spinozf 2010-12-22 09:55:03

回答

4
  • 改變該列鍵入日期或日期時間
  • 不使用英國的日期格式,使用ISO-8601格式
  • 和索引該列
+0

嗨,我不幸與英國格式卡住,因爲它是我需要使用的現有數據庫 - 我通常會使用UNIX時間戳進行數據存儲。 – spinozf 2010-12-20 19:20:18

0

,我正使用MySQL日期邏輯。你可以偷偷摸摸,並使用該DOB列存儲爲文本這個謊言這樣一個事實:

SELECT whatever FROM users WHERE dob LIKE DATE_FORMAT(CURDATE(), '%d/%m/%%'); 

這將當前的日期,格式它像一個英國的日期(%%變成一個單一%) 。因此,對於今天(如我發佈),這將是'20/12 /%'。它將它用於dob上的LIKE,爲每個人提供'20/12 /(something)'的生日。

這有點奇怪,但它實際上利用了將DOB存儲爲文本格式。我假設有一個DOB的索引,儘管如果你沒有太多人,你可以在沒有它的情況下離開。

對於第二個查詢,它看起來像你試圖做一個'6個月前出生的人'類型的東西。是對的嗎?你可以使這樣的事情:

SELECT whatever FROM users WHERE DATE_ADD(CURDATE(), INTERVAL -6 MONTH) = STR_TO_DATE(dob, '%d/%m/%Y'); 

這不是一個漂亮的,如果你想誰出生的人6,18,30 ......幾個月前,它不會工作。在那種情況下,我實際上會採用類似你所擁有的東西。這並不理想,但它可能會或多或少地起作用,其結果可能足夠接近您。

0

datediff(now(),dob)會給你兩個日期之間的天差異。

如果你想看看是否有人爲至少18,儘量if (date_sub(now(),18 years) > dob)

大家二月出生的? if (month(dob) = 2)

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

編輯:既然你堅持(對深不可測的原因),這表明這不是日期格式的日期的數據庫,你STR_TO_DATE(dob...部分取代DOB。