Mysql
 sql >> база данни >  >> RDS >> Mysql

Използване на DATE_ADD с име на колона като стойност на интервала

Няма да е лесно да получите резултата си - тъй като го съхранявате като обикновен 1 Year или подобен. Това ене разрешено да го използва динамично в INTERVAL конструкция - MySQL синтаксис изисква че ще посочите както количеството, така и вида на интервала.

Въпреки това, има един вид трик за разрешаване на проблема:

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

-както виждате, тази заявка разчита на факта, че количеството винаги е първо (така CAST ще извлече точно него, следователно може да се използва за получаване на дължина на интервала след това). Но във всеки случай ще трябва да преброите всички възможни типове интервали в CASE клауза

Друга добра идея би била – да съхранявате цикъла си в унифицирана форма (например винаги в дни) – така че ще съхранявате само едно число за всеки ред (по този начин 1 седмица=7 дни и т.н.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Работа с големи записи в приложение на Java EE

  2. Spring Boot CRUD Пример с MySQL

  3. SQLSTATE[HY000] [1698] Достъпът е отказан за потребител 'root'@'localhost'

  4. Индексът на Varchar прави ли разлика в производителността?

  5. MySQL и NHibernate. Как да коригирате грешката:Колона „ReservedWord“ не принадлежи на таблица ReservedWords?