【问题标题】:How to create table from qry result that has date calculation in MySQL?如何从 MySQL 中具有日期计算的查询结果创建表?
【发布时间】:2014-04-16 04:45:05
【问题描述】:

我想从 qry 结果创建一个表。以下 qry 运行正常:

create table x select 
date_format(TERMINATION_DT,'%Y-%m-%d') as Term_Date
, date_format(BIRTH_DT,'%Y-%m-%d') as DOB
from dashboard_04102014
where status = 'withdrawn';

有一些termination_dt 值为空''where status = 'withdrawn' 过滤掉空值。但是,当我尝试使用以下 qry 执行日期计算时,我收到一条错误消息:

create table x select 
date_format(TERMINATION_DT,'%Y-%m-%d') as Term_Date
, round(datediff(date_format(TERMINATION_DT,'%Y-%m-%d'), date_format(BIRTH_DT,'%Y-%m-%d'))/365,0) as Age
from dashboard_04102014
where status = 'withdrawn';

这是错误信息:

incorrect datetime value" '0000-00-00'

我猜那些空的termination_dt 值被转换为0000-00-00 从而抛出datediff?但是这些值首先被 where 子句过滤掉了。

另外,我可以完美地运行select 部分,它会返回我想要的结果。但是当我想从中创建一个表时,我收到了第二个 qry 的错误消息。为什么我可以使用第一个 qry 而不是第二个创建表?

谢谢!

添加原始表格条:

CREATE TABLE dashboard_04102014
   (`status` varchar(9), `termination_dt` int, `birth_dt` int);

INSERT INTO Table1
(`status`, `termination_dt`, `birth_dt`)
VALUES
('Active', 0, 19560329),
('Withdrawn', 20070208, 19690131),
('Withdrawn', 20090702, 19441219),
('Active', 0, 19520912),
('Withdrawn', 20130730, 19480404);

【问题讨论】:

  • termination_dtbirth_dt 上定义的实际数据类型是什么?他们是datedatetimetimestamp 还是别的什么?
  • 在创建的表 x 上运行 select 并查看记录的日期格式和值是否正确。
  • 可能有点矫枉过正,但尝试将值转换为最新:cast(date_format(termination_dt, '%Y-%m-%d') as date)
  • @Ravinder - termination_dtbirth_dt 的原始数据类型是 integer,即 201101012011020120140401 等。但是有很多行不t 具有 termination_dt 的值。所以转换为日期后,新值为0000-00-00。我不知道这是否会影响计算。
  • don't have value 是什么意思?它们是空的'' 还是NULL

标签: mysql date create-table


【解决方案1】:

如果您没有从日期列中选择 NULLempty 条目,则

drop table if exists x;

create table x 
select 
  cast( date_format( BIRTH_DT,'%Y-%m-%d' ) as date ) as BIRTH_DT
  , cast( date_format( TERMINATION_DT,'%Y-%m-%d' ) as date ) as Term_Date
  , cast( round( datediff( date_format( TERMINATION_DT, '%Y-%m-%d' ), 
                     date_format( BIRTH_DT, '%Y-%m-%d' ) 
                 ) / 365, 0 ) as decimal( 6, 2 ) ) as Age
from dashboard_04102014
where 
      status = 'withdrawn'
      -- un comment following line if required
      -- AND ( BIRTH_DT is not null and BIRTH_DT = '' and BIRTH != 0 )
  and ( TERMINATION_DT is not null 
        and TERMINATION_DT != '' 
        and TERMINATION_DT != 0 )
;

结果

desc x;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| BIRTH_DT  | date         | YES  |     | NULL    |       |
| Term_Date | date         | YES  |     | NULL    |       |
| Age       | decimal(6,2) | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

select * from x;
+------------+------------+-------+
| BIRTH_DT   | Term_Date  | Age   |
+------------+------------+-------+
| 1992-07-31 | 2050-07-31 | 58.00 |
| 1971-02-24 | 2029-02-24 | 58.00 |
+------------+------------+-------+

演示1@MySQL 5.5.32 Fiddle
演示2@MySQL 5.5.32 Fiddle

【讨论】:

  • 嗨 Ravinder,我尝试了你的 qry,但仍然收到相同的错误消息“日期时间值不正确:'0000-00-00'。但看起来你得到的结果很好。确认一下,BIRTH_DT 没有 null 或 ''。
  • 用新的My SQL Fiddle Demo检查我的更新答案
  • 嗨拉文德,它成功了!!!所以and ( TERMINATION_DT is not null and TERMINATION_DT != '' and TERMINATION_DT != 0 ) 成功了。我还删除了cast,它运行良好。再次感谢您的时间帮助我!!!
  • @PerriMa:如果您删除cast,那么结果列将是varchar
  • 嗨,Ravinder.. 我明白了......但是datediff 的计算结果是准确的。所以它将termination_dtbirth_dt 视为日期,即使desc 也将它们显示为varchar
【解决方案2】:

我认为您应该提及 datetime 数据类型

非法的 DATE、DATETIME 或 TIMESTAMP 值将转换为相应类型的“零”值('0000-00-00'、'0000-00-00 00:00:00' 或 00000000000000)。

https://dev.mysql.com/doc/refman/5.1/en/datetime.html

如果你提到datetime 意味着你应该提到:

0000-00-00 00:00:00

【讨论】:

  • 我编辑了原始帖子以使其更清晰。当您说“我应该提及日期时间数据类型”时,您的意思是在帖子中还是在创建表 stmt 中?
猜你喜欢
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2018-12-16
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
相关资源
最近更新 更多