2009-05-20 24 views
19

Ben üç sütun vardır: Böyle bir tarih sütunu, bir tamsayı sütunu ve varchar sütunu:Bir mysql tarih aralığı sabiti (DAY, MONTH ...) olarak dize/sütun değeri nasıl kullanılır?

+------------+------+---------+ 
| date  |value | unit | 
+------------+------+---------+ 
| 2009-01-01 | 2 | DAY  | 
| 2009-02-01 | 3 | MONTH | 
+------------+------+---------+ 

I (mysql date_add içinde tamsayı değerleri ve varchar sütunu kullanmak istiyorum) işlevi olarak "INTVERAL" ifadesinin bir parçası olan 'date' sütunundaki tarihe eklendi.

Örneğin

: date_add (2009-01-01, ARALIK GÜN), bu yüzden '2009-01-01 'tarihi' sütunundan olduğu, '2' "value"/integer sütunundan ve "DAY" ifadesi "unit"/varchar sütunundan gelir.

Ve şuna benzer seçme:

select date_add(table.date_column, INTERVAL table.integer_column table.varchar_column) from table 

Sorun şudur: çalışmıyor. tarih ve tamsayı sütun, işleri, bu Tamam:

select date_add(table.date_column, INTERVAL table.integer_column DAY) from table 

ama en kısa sürede bir hata mesajı almak bir sütundan bir dize değeri ile "GÜN" Anahtar Kelime değiştiriyoruz.

Herhangi bir Fikir?

daha genel bir sorundur sanırım ben:

Dinamik sabitler/anahtar ifadeler gibi değerleri alınan kullanmak nasıl? Mysql'de bir tür "eval" işlevi var mı?

Bu sorun uzun zamandır beni rahatsız ediyor, herhangi bir yardım gerçekten harika olurdu.

The Beat

cevap

6

Ben bir sonlu evren beri, birim sütunun her olası değeri için CASE deyimi kullanarak daha iyi olduğunu düşünüyorum. Sütunu bir varchar olarak tutmayı veya bunun yerine bir tamsayı kodu kullanmayı seçebilirsiniz.

Tabloya eklenen değerlerin% 120 oranında dikkatli olmadıkça, varolan bir tablodan oluşturulmuş olsa bile, dinamik olarak SQL deyimlerini çalıştırmayı kullanmaktan vazgeçiririm. Aşağıdaki değerleri tabloda bir şekilde elde ederseniz ne yapardınız? Hata!

+------------+------+------------------------------------+ 
| date  |value |     unit    | 
+------------+------+------------------------------------+ 
| 2009-01-01 | 2 | DAY        | 
| 2009-02-01 | 3 | MONTH        | 
| 2009-03-01 | 4 | DAY) FROM table; DROP TABLE table; | 
+------------+------+------------------------------------+ 
-3

benim makinede MySQL yeniden ortasındayım, bu yüzden bunu test edemez, ama CONCAT() burada izin verildiği takdirde belki geçerli bir dize içine birleştirerek, yardımcı olabilir:

SELECT 
    DATE_ADD(
     table.date_column, 
     INTERVAL CONCAT(
     table.integer_column, 
     ' ', 
     table.varchar_column 
    ) 
    ) 
+0

Bunu test ettik ve çalışmıyor. – stldoug

12

Maalesef MySQL INTERVAL sonra bir anahtar kelime bekler ve herhangi bir dize veya sayısal değer değil. İstediğinizi bir CASE ifadesi kullanarak elde edebilir ve farklı durumlara farklı anahtar kelimeler verebilirsiniz.

Örnek olarak

, en sonra şunları SQL deyimi olacaktır bugüne kadar uygun birim ile değer katmak istiyoruz diyelim:

SELECT CASE unit 
     WHEN "DAY" THEN date_add(date, INTERVAL value DAY) 
     WHEN "MONTH" THEN date_add(date, INTERVAL value MONTH) 
     END 
     AS newDate 
FROM table 

Ayrıca bu arada WHERE cümleciği çalışır :)

İlgili konular