Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation de DATE_ADD avec un nom de colonne comme valeur d'intervalle

Il ne sera pas facile d'obtenir votre résultat - puisque vous le stockez en tant que simple 1 Year ou similaire. Ce n'est pas autorisé à l'utiliser dynamiquement dans INTERVAL construction - syntaxe MySQL demandes que vous indiquerez à la fois la quantité et le type d'intervalle.

Cependant, il existe une sorte d'astuce pour résoudre le problème :

SELECT 
    product_name, 
    start_date,
    expiry_period,
    @num:=CAST(expiry_period AS UNSIGNED),
    @p  :=SUBSTR(expiry_period, CHAR_LENGTH(@num)+2),
    CASE
      WHEN @p='Year' THEN DATE_ADD(start_date, INTERVAL @num YEAR)
      WHEN @p='Month' THEN DATE_ADD(start_date, INTERVAL @num MONTH)
      WHEN @p='Day' THEN DATE_ADD(start_date, INTERVAL @num DAY)
      WHEN @p='Week' THEN DATE_ADD(start_date, INTERVAL @num WEEK)
    END AS end_date
FROM
    tbl_products

-comme vous pouvez le voir, cette requête repose sur un fait, cette quantité passe toujours en premier (donc CAST l'extrairea exactement, par conséquent, il peut être utilisé pour obtenir la longueur de l'intervalle après cela). Mais dans tous les cas, il faudra recompter tous les possibles types d'intervalle dans CASE clause

Une autre bonne idée serait - de stocker vos règles sous une forme unifiée (par exemple, toujours en jours) - de sorte que vous ne stockez qu'un seul numéro pour chaque ligne (ainsi, 1 semaine =7 jours, etc.)