所以我有一个很大的表,如果不破坏我的PHP应用程序就无法改变.愚蠢(是的,我知道),我将开始日期和结束日期设为VARCHAR,数据存储为'03/04/2013'.
现在,我需要能够搜索哪些行当前处于"活动状态",这意味着哪些行在今天之前具有开始日期,在今天之后具有结束日期.
使用SQL查询可以实现这一点吗?
VARCHAR在DATE不破坏应用程序的情况下迁移列的行动计划:
创建新的索引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)创建插入/更新触发器以将VARCHAR列转换为DATE新DATE列并使用各自的值更新新列:
-- 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)使用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)花点时间更新您的应用程序,以便VARCHAR直接使用原始列的位置,同时不会破坏任何内容.
完成后删除触发器和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小提琴.