- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从一个 csv 文件中获取数据并将其全部放入一个临时表中,因此所有内容都是字符串格式。
所以即使是日期字段也是字符串格式,所以我需要将日期从字符串转换为日期。所有日期都采用这种格式 28/02/2013
我为此使用了 STR_TO_DATE,但我遇到了问题。这是我的代码片段。
INSERT INTO `invoice` (`DueDate`)
SELECT
STR_TO_DATE('','%d/%m/%Y')
FROM `upload_invoice`
当然还有比这更多的字段,但我专注于不起作用的字段。如果日期无效,则使用此命令它应该放入一个空值,但它不会放入一个空值,而是生成一个错误。
#1411 - Incorrect datetime value: '' for function str_to_date
我明白这个错误是什么意思。这意味着它得到一个空字段而不是格式正确的日期,但在阅读文档后它不应该抛出错误,但它应该插入一个空值。
但是,如果我使用不带 INSERT 的 SELECT 语句,它会起作用。
我可以做下面的行,它实际上在一定程度上起作用
IF(`DueDate`!='',STR_TO_DATE(`DueDate`,'%d/%m/%Y'),null) as `DueDate`
因此,如果该字段为空,则 STR_TO_DATE 不会运行。现在这有效,但它无法检查无效的日期,例如日期是否为 ASDFADFAS。
然后我尝试了
IF(TO_DAY(STR_TO_DATE(`DueDate`,'%d/%m/%Y') IS NOT NULL),STR_TO_DATE(`DueDate`,'%d/%m/%Y'),null) as `DueDate`
但这仍然会在 if 语句中给出 #1411 错误。
所以我的问题是,为什么 STR_TO_DATE 不在错误的日期返回 NULL?我不应该收到 #1411 错误。
这不是另一个问题的完全重复。也没有满意的答复。我解决了这个问题并添加了我的解决方案,这实际上是另一篇文章中给出的更好的解决方案,所以我认为因为我的更好答案,所以应该保留。
最佳答案
您可以尝试的一个选项:
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.19 |
+-----------+
1 row in set (0.00 sec)
mysql> DROP TABLE IF EXISTS `upload_invoice`, `invoice`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `invoice` (
-> `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> `DueDate` DATE
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `upload_invoice` (
-> `DueDate` VARCHAR(10)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `upload_invoice`
-> (`DueDate`)
-> VALUES
-> ('ASDFADFAS'), (NULL), (''),
-> ('28/02/2001'), ('30/02/2001');
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> INSERT INTO `invoice`
-> SELECT
-> NULL,
-> IF(`DueDate` REGEXP '[[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{4}' AND
-> UNIX_TIMESTAMP(
-> STR_TO_DATE(`DueDate`, '%d/%m/%Y')
-> ) > 0,
-> STR_TO_DATE(`DueDate`, '%d/%m/%Y'),
-> NULL)
-> FROM `upload_invoice`;
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> SELECT `id`, `DueDate`
-> FROM `invoice`;
+----+------------+
| id | DueDate |
+----+------------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | 2001-02-28 |
| 5 | NULL |
+----+------------+
5 rows in set (0.00 sec)
参见 db-fiddle .
关于mysql - STR_TO_DATE 给出错误而不是 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45301379/
我在尝试将日期列的格式从如下所示:05-JUN-15 转换为标准 MYSQL 格式时遇到问题。我尝试做的是: UPDATE sp_building_headcount set `ATTENDA
我在使用 STR_TO_DATE 函数的两个不同 Docker 镜像中遇到了不一致的行为。在一个 ubuntu 机器上运行,另一个在我的 Mac 上运行。 在 Linux 上: SELECT STR_
这是怎么回事? str_to_date('26/04/2011 00:00:00', '%d/%m/%Y')它给出 Error Code: 1292 Truncated incorrect date
我有一个名为 ReleaseDate 的列(它是一个字符串)。它们中的大多数采用 %e %M %Y(1979 年 5 月 25 日)的形式,但也有一些只是 %M %Y(1979 年 5 月) ) 或
我正在尝试运行一个函数来返回两个日期之间的天数差。出于这个原因,我根据日期参数获取两个日期(这工作正常)。接下来,如果在表中找不到日期,我将使用参数 date pdate 来构造日期。这种日期结构没有
str_to_date 和 concat 联合函数与时间和日期。我不知道如何在访问时将格式更改为导入或之后或直接填充。 CREATE trigger `trigger` before insert
以下内容从我的数据库返回一堆行: USE test; SELECT * FROM aaaa WHERE dddd BETWEEN (NOW() - INTERVAL 42 DAY) AND (NOW(
我正在使用应用程序日志中的时间戳,格式为“Apr 28 09:54:46”,这是下面 NEW.timestamp 中的值的格式。在按以下方式插入之前尝试使用触发器进行解析。 CREATE DEFINE
我正在尝试使用 STR_TO_DATE() 函数插入日期。由于某种原因它一直失败。有人可以帮忙吗?谢谢 HTML: Total Sales : Company Name : Sales T
这很奇怪,但我不明白到底发生了什么。我只是想通过计算两个日期之间的差异来更新我的列值。我有两列,其日期为 column_45 和 column_14,这两列的日期格式均为 4/8/2011 和 4/8
专家们,我快疯了...str_to_date 不起作用 mysql> describe product_tbl; +--------------------+-------------+------+
问候 Stackian Overflowers, 我正在尝试覆盖现有列中的数据,并在已设置的情况下执行 STR_TO_DATE。 代码如下: SELECT IF(columnA = '../../..
我想将 MySQL 字符串转换为所需的日期格式。 我的文件中有以下几行。 30-06-2017,clarke 31-07-2018,warner 我的表格有 2 列。 Column1 datatype
如果我在 MySQL 中使用这个命令: SELECT node.nid AS nid, users.uid AS users_uid, node.created AS node_created FRO
我的数据库中有一个 varchar 类型的 datecreated 字段。不幸的是,我无法将此字段更改为日期格式,因此我必须在选择数据时执行此操作。我试图根据日期对记录进行排序(以便显示最近的年、月、
我需要使用 STR_TO_DATE 将日期时间插入到 mysql 表中,但下面的命令给出的日期时间列始终为 NULL。 insert into DETECTED values(NULL,STR_TO
我正在尝试使用 STR_TO_DATE 函数格式化包含时间值的字符串。时间值为:不带前导零的小时(0-23) + 分钟(00-59)例如800、1245 或 1535。为了格式化这些值,我尝试使用 %
我在使用以下代码时遇到问题: INSERT into `fun` ( funner) SELECT YEAR(STR_TO_DATE(SUBSTRING(time,1,4), '%Y')) FROM
我的 MySQL(版本 5.7.25)数据库有一列,其中充满了 varchar(100) 日期,例如 Fri May 04 08:08:42 UTC 2018.我需要将它们转换为日期。 到目前为止我已
我正在尝试执行一些计算并使用 SQL 查询使用计算值更新表。使用的查询如下: UPDATE `table1` pv inner join (SELECT Email,IF(`DS Start
我是一名优秀的程序员,十分优秀!