【问题标题】:SQL STR_TO_DATESQL STR_TO_DATE
【发布时间】:2019-07-18 06:07:13
【问题描述】:

以下代码有问题:

INSERT into `fun` ( funner)
SELECT YEAR(STR_TO_DATE(SUBSTRING(time,1,4), '%Y')) 
FROM `orig` 

返回警告:

日期时间值不正确:函数 str_to_date 的“1880”

time 是表orig 中的一个varchar 列,格式为yyyy/mm

我想从这个 varchar 中提取年份部分并使用 STR_TO_DATE 将其转换为年份数据类型

【问题讨论】:

  • 为什么SUBSTRING(time,1,4)不够用?
  • @salman A 因为我将数据插入到具有日期/时间数据类型的列中

标签: mysql sql str-to-date error-messaging


【解决方案1】:

我建议使用usual date and time MySQL datatypes 之一,而不是很少使用的YEAR datatypeDATEDATETIMETIMESTAMP

如果要将字符串转换为 date 数据类型,则:

STR_TO_DATE(my_column, '%Y/%m')

你可以在这个日期使用YEAR()函数,它会返回一个integer值:

YEAR(STR_TO_DATE(my_column, '%Y/%m'))

最后:如果您只想从存储为字符串的日期中获取年份,那么您可以使用SUBSTR 直接提取字符串:

SUBSTR(my_column, 1, 4)

这将返回一个字符串(不是整数),当在数字上下文中使用时,MySQL 将隐式转换为数字。

【讨论】:

  • @GMB 我一定是误解了日期和时间部分下的“年(4)”选项是一种类型?除了 DATE、DATETIME 和 TIMESTAMP 之外,我还有 TIME 和 YEAR
  • @HannahGarcia:我的错!我稍微更新了我的答案。
【解决方案2】:

您可以将SUBSTRING(time,1,4) 转换为整数:

SELECT CONVERT(SUBSTRING(time,1,4),UNSIGNED INTEGER) FROM orig 

无需先将其转换为日期,然后再转换为整数。
我猜你需要返回一个整数值,因为你使用 YEAR() 函数。
如果不是简单的SELECT SUBSTRING(time,1,4) FROM orig 就可以了。

【讨论】:

    【解决方案3】:

    time 是什么样的?如果year 的数据类型为年份,则可以在列中插入日期:

    INSERT into `clean` (year)
        SELECT DATE(CONCAT(SUBSTRING(time, 1, 4), '-01-01')) 
        FROM `orig` ;
    

    我不喜欢 year 数据类型。您应该将整个日期放入列中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 2021-12-29
      • 2018-07-02
      • 2013-07-19
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多