【问题标题】:Fetching a non-datetime string value from a column从列中获取非日期时间字符串值
【发布时间】:2012-11-27 18:27:03
【问题描述】:

我最近运行了一个脚本,将数据从一个大表(大约 20 GB)复制到另一个,我搞砸了,日期时间列(称为timestamp)的列值被保存到另一个带有 varchar 的列中数据类型(称为category_name),而timestamp 值要么设置为NULL,要么具有一系列随机日期时间值(如0000-00-00 00:00:000003-02-01 00:00:001990-12-00 00:00:00 等)。我复制到的表也不断获取新数据。然而,新数据并未损坏。我正在尝试确定我的好数据开始的行的确切 ID。请注意,category_name 列的有效值要么是字母值,要么是 NULL。我尝试了以下查询 -

SELECT * FROM table_name 
WHERE `timestamp` IS NOT NULL 
AND `timestamp` != "0000-00-00 00:00:00"
ORDER BY id;

那时我发现timestamp列中保存了各种值。

我接下来尝试了

SELECT * FROM table_name WHERE category_name REGEXP '[^a-zA-Z]' LIMIT 10;

这不起作用。

SELECT * FROM table_name WHERE category_name REGEXP '[:alpha:]' LIMIT 10;

这也不起作用。

任何帮助将不胜感激,谢谢。我只是想从我的category_name 列开始获取有效数据而不是日期时间字符串的位置获取大致的 ids/rows 范围。

【问题讨论】:

    标签: mysql regex string datetime


    【解决方案1】:

    尝试使用STR_TO_DATE()函数。如果不能将字符串转换为日期,则返回 NULL。并检查转换日期是否在您需要的范围内(在此示例中为去年 (CURDATE()-365)

    SELECT * FROM table_name 
    WHERE `timestamp` IS NOT NULL 
    AND LENGTH(`timestamp`)=19
    AND IFNULL(STR_TO_DATE(`timestamp`,'%Y-%m-%d %h:%i:%s'),0)>CURDATE()-365 
    ORDER BY id limit 1;
    

    【讨论】:

      【解决方案2】:

      您好,您可以将格式从时间戳更改为日期http://www.w3schools.com/sql/sql_dates.asp

      http://forums.devshed.com/mysql-help-4/how-to-format-and-display-only-the-date-from-timestamp-1846.html

      然后在此之后操作您的数据。

      您可能还想探索如何在 PHP 中执行此操作。

      【讨论】:

      • 嘿,感谢您的回答,但我无法更改数据类型或以任何方式更改表,因为该表是实时的并且正在接收实时数据。
      • 如果您需要自动设置,请尝试使用 ETL 工作室,例如专用服务器上的 Talend、pentaho 或 jaspersoft etl,您可以安排每小时、每天或您可能需要的频率运行。
      • 您可以安排一个 etl 作业在服务器不更新时运行,而不必手动执行。
      【解决方案3】:

      我终于使用数据库的备份解决了这个问题。我在运行脚本时恢复了数据库的备份。使用它,我能够获得我的数据被破坏的 ID。然后我将我的干净数据(从那个 id 开始)移动到这个恢复的表并切换表名。不过,这需要一段时间并导致一些数据丢失。

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 1970-01-01
        • 2015-05-11
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        相关资源
        最近更新 更多