首页 > 解决方案 > 基于时间戳更新列的任何快速方法

问题描述

我有一个数据库表,其列存储时间戳的格式如下 01-SEP-2020 我在同一个表中添加了一个新列 BHAV_ID,具有整数数据类型,现在为空白

现在,我正在尝试根据时间戳值更新列 BHAV_ID 例如,附件是屏幕截图

在此处输入图像描述 2018 年 1 月 19 日相当于 2180119(YYYYMMDD) 更新为该列中的整数数据类型

从 java 代码的角度来看,我正在使用一种肮脏的技术,我一次读取一行并计算和更新 BHAV_ID 列中的值。但它会花费很多时间。要更新 780 条记录,需要将近 40 分钟才能完成。

表中有 20,000,000 条记录。如果我使用 Coding 方法,那么它会一起持续数周,所以我正在寻找数据库查询级别的任何帮助。

标签: mysql

解决方案


假设所有TIME_STAMP值都与示例“DD-MMM-YYYY”中的格式一致,并且月份根据 MySQL 中的标准缩写,您可以使用STR_TO_DATE然后选择使用DATE_FORMAT生成您想要的格式或简单地删除-使用REPLACE的连字符 ( ) 。

/*USING DATE_FORMAT  + STR_TO_DATE*/
SELECT BHAV_ID, DATE_FORMAT(STR_TO_DATE(TIME_STAMP, '%d-%b-%Y'),'%Y%m%d') 
FROM TABLE_A;

/*USING REPLACE + STR_TO_DATE*/
SELECT BHAV_ID, REPLACE(STR_TO_DATE(TIME_STAMP, '%d-%b-%Y'),'-','') 
FROM TABLE_A;

上面的两个查询都可以将TIME_STAMP您拥有的当前格式转换为您想要的所需格式。将其中任何一个转换为UPDATE类似的语法(以第一个示例为例):

UPDATE TABLE_A 
SET BHAV_ID = DATE_FORMAT(STR_TO_DATE(TIME_STAMP, '%d-%b-%Y'),'%Y%m%d') 
WHERE BHAV_ID IS NULL;

您可以在此处查看演示小提琴以及 MySQL 中提取的月份缩写名称列表。


推荐阅读