我愚蠢地将日期作为VARCHAR排成一行,我还可以选择基于日期的选择吗?

Mar*_*ark 2 mysql

所以我有一个很大的表,如果不破坏我的PHP应用程序就无法改变.愚蠢(是的,我知道),我将开始日期和结束日期设为VARCHAR,数据存储为'03/04/2013'.

现在,我需要能够搜索哪些行当前处于"活动状态",这意味着哪些行在今天之前具有开始日期,在今天之后具有结束日期.

使用SQL查询可以实现这一点吗?

Ant*_*oly 5

VARCHARDATE不破坏应用程序的情况下迁移列的行动计划:

  1. 创建新的索引DATE列并使用列中的相应值填充它们VARCHAR:

    -- new column
    ALTER TABLE MY_TABLE ADD `NEW_DATE_COLUMN` DATE;    
    -- index
    CREATE INDEX `MY_TABLE_NEW_DATE_IDX` ON MY_TABLE(`NEW_DATE_COLUMN`);
    -- initial values
    UPDATE MY_TABLE 
    SET `NEW_DATE_COLUMN` = STR_TO_DATE(`VARCHAR_DATE`, '%d/%m/%Y')
    WHERE `NEW_DATE_COLUMN` IS NULL;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建插入/更新触发器以将VARCHAR列转换为DATEDATE列并使用各自的值更新新列:

    -- triggers
    DELIMITER //
    CREATE TRIGGER `MY_TABLE_VARCHAR_DATE_BI` BEFORE INSERT ON MY_TABLE
      FOR EACH ROW
      BEGIN
        IF NEW.`NEW_DATE_COLUMN` IS NULL AND NEW.`VARCHAR_DATE` IS NOT NULL THEN
          SET NEW.NEW_DATE_COLUMN = STR_TO_DATE(NEW.`VARCHAR_DATE`, '%d/%m/%Y');
        END IF;
      END;
    //
    CREATE TRIGGER `MY_TABLE_VARCHAR_DATE_BU` BEFORE UPDATE ON MY_TABLE
      FOR EACH ROW
      BEGIN
        IF NEW.`NEW_DATE_COLUMN` IS NULL AND NEW.`VARCHAR_DATE` IS NOT NULL THEN
          SET NEW.NEW_DATE_COLUMN = STR_TO_DATE(NEW.`VARCHAR_DATE`, '%d/%m/%Y');
        END IF;
      END;
    //
    DELIMITER;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用DATE查询中的列:

    SELECT * FROM MY_TABLE
    WHERE `NEW_DATE_COLUMN` BETWEEN 
    CURRENT_DATE AND DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 花点时间更新您的应用程序,以便VARCHAR直接使用原始列的位置,同时不会破坏任何内容.

  5. 完成后删除触发器和VARCHAR列:

    DROP TRIGGER `MY_TABLE_VARCHAR_DATE_BI`;
    DROP TRIGGER `MY_TABLE_VARCHAR_DATE_BU`;
    
    ALTER TABLE MY_TABLE DROP `VARCHAR_DATE`;
    
    Run Code Online (Sandbox Code Playgroud)

工作SQL小提琴.