php插入日期到mysql失败

$today = date("m-d-Y");

我在php里把日趋设置为以上格式,

而我的mysql中如期类型是date;

插入数据时始终插入失败,mysql data显示为0000-00-00;

为什么?

看下面文章:

mySQL 日期类型:日期格式、所占存储空间、日期范围 比较。

 日期类型        存储空间       日期格式                 日期范围
------------  ---------   --------------------- -----------------------------------------
 datetime       8 bytes   YYYY-MM-DD HH:MM:SS   1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
 timestamp      4 bytes   YYYY-MM-DD HH:MM:SS   1970-01-01 00:00:01 ~ 2038
 date           3 bytes   YYYY-MM-DD            1000-01-01          ~ 9999-12-31
 year           1 bytes   YYYY                  1901                ~ 2155

在 MySQL 中创建表时,对照上面的表格,很容易就能选择到合适自己的数据类型。不过到底是选择 datetime 还是 timestamp,可能会有点犯难。这两个日期时间类型各有优点:datetime 的日期范围比较大;timestamp 所占存储空间比较小,只是 datetime 的一半。

另外,timestamp 类型的列还有个特性:默认情况下,在 insert, update 数据时,timestamp 列会自动以当前时间(CURRENT_TIMESTAMP)填充/更新。“自动”的意思就是,你不去管它,MySQL 会替你去处理。

一般情况下,我倾向于使用 datetime 日期类型。

MySQL 时间类型:时间格式、所占存储空间、时间范围。

 时间类型        存储空间      时间格式                 时间范围
------------  ---------   --------------------- -----------------------------------------
 time           3 bytes   HH:MM:SS              -838:59:59          ~ 838:59:59

time 时间范围居然有这么大的范围,特别是 time 可以取负值,有点奇怪。后来,看了 MySQL 手册才知道这是为了满足两个日期时间相减才这样设计的。

select timediff('2000:01:31 23:59:59', '2000:01:01 00:00:00');  --  743:59:59
select timediff('2000:01:01 00:00:00', '2000:01:31 23:59:59');  -- -743:59:59
select timediff('23:59:59', '12:00:00');                        --  11:59:59

注意,timediff 的两个参数只能是 datetime/timestamp, time 类型的,并且这两个参数类型要相同。即:datetime/timestamp 和 datetime/timestamp 比较;time 和 time 相比较。

虽然 MySQL 中的日期时间类型比较丰富,但遗憾的是,目前(2008-08-08)这些日期时间类型只能支持到秒级别,不支持毫秒、微秒。也没有产生毫秒的函数。

----------------------------------

可知,data有固定的格式xxxx--xx-xx,如果我们插入了不合适的格式,mysql是不会接受的。

NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。 

CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以直接存到DATE字段中。 

CURTIME()以'HH:MM:SS'的格式返回当前的时间,可以直接存到TIME字段中。 

例:insert into tablename (fieldname) values (now())

获取当前时间的MySql时间函数

处理MySql时间日期的函数有很多,下面为您介绍的就是用于获取当前时间的MySql时间函数,如果您对此感兴趣的话,不妨一看

下面为您介绍的MySql时间函数用于获取当前时间,该MySql时间函数极具实用价值,希望能对您学习MySql时间函数方面有所帮助。

mysql> select current_timestamp(); 
+---------------------+ 
| current_timestamp() | 
+---------------------+ 
| 2010-01-18 21:24:37 | 
+---------------------+ 
1 row in set (0.00 sec) 

mysql> select current_date(); 
+----------------+ 
| current_date() | 
+----------------+ 
| 2010-01-18 | 
+----------------+ 
1 row in set (0.00 sec) 

mysql> select current_time(); 
+----------------+ 
| current_time() | 
+----------------+ 
| 21:24:46 | 
+----------------+ 
1 row in set (0.00 sec) 
MySQL5日期类型DATETIME和TIMESTAMP相关问题详解
 
MySQL5的日期类型有三种:DATETIME、DATE和TIMESTAMP,除了DATE用来表示一个不带时分秒的是日期,另外两个都带时分秒。TIMESTAMP还可以精确到毫秒。
 
其次还有个共性,就是他们的格式“不严格”,很自由,一般你认为对的格式都可以正确插入到数据库中。
 
这里主要解决带时分秒日期的一些常见问题。
 
一、IMESTAMP
 
1、TIMESTAMP列必须有默认值,默认值可以为“0000-00-00 00:00:00”,但不能为null。
2、TIMESTAMP列不可以设置值,只能由数据库自动去修改。有点怀疑。
3、一个表可以存在多个TIMESTAMP列,但只有一个列会根据数据更新而改变为数据库系统当前值。因此,一个表中有多个TIMESTAMP列是没有意义,实际上一个表只设定一个TIMESTAMP列。
4、TIMESTAMP列的默认值是CURRENT_TIMESTAMP常量值。当纪录数据发生变化的时候,TIMESTAMP列会自动将其值设定为CURRENT_TIMESTAMP。
5、TIMESTAMP列创建后的格式是:
`a` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
这个语句含义,a字段的默认值是CURRENT_TIMESTAMP,当纪录更新时候,自动将a字段的值设置为CURRENT_TIMESTAMP。
6、另外,下面的定义从语法角度是对的,但是没有意义,因为该字段的值不可更改,永远只能为默认值。
`b` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
 
 
二、DATETIME
 
1、DATETIME列可以设置为多个,默认可为null,可以手动设置其值。
2、DATETIME列不可设定默认值,这是很多人煞费苦心研究的成果,呵呵!
3、DATETIME列可以变相的设定默认值,比如通过触发器、或者在插入数据时候,将DATETIME字段值设置为now(),这样可以做到了,尤其是后者,在程序开发中常常用到。
 
一般建表时候,创建时间用datetime,更新时间用timestamp。
CREATE TABLE user ( 
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    name varchar(20) CHARACTER SET gbk NOT NULL
    sex tinyint(1) DEFAULT '1'
    state smallint(2) DEFAULT '1'
    createtime datetime NOT NULL
    updatetime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    PRIMARY KEY (id) 
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
 
三、日期最大值范围的问题
 
日期最大范围的问题不是绝对的,很多人制定一个说不能查过20XX年,这是扯蛋,根本没这回事。日期的范围等问题与MySQL的运行模式有关。当然这个范围很宽广,足够祖宗十八代用了,不用担心这问题了。
 
相反,要注意的问题是,编程语言对日期范围的限制,不同的语言,有不同的限制,这里不做讨论了。
 
原文地址:https://www.cnblogs.com/youxin/p/2667165.html