zoukankan      html  css  js  c++  java
  • 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的运行模式有关。当然这个范围很宽广,足够祖宗十八代用了,不用担心这问题了。
     
    相反,要注意的问题是,编程语言对日期范围的限制,不同的语言,有不同的限制,这里不做讨论了。
     
  • 相关阅读:
    knockout 与checkbox联动
    汤姆大叔的博客--Knockout应用开发指南
    Java 读取Properties配置文件
    [转]“在CMD下面执行命令需要加上exe后缀才能执行“的解决方案
    storm在Ubuntu环境下的单机部署
    [转] java内存分配分析/栈内存、堆内存
    Java 不可变类
    scala入门 case class
    scala入门 模式匹配
    scala入门 包和引入
  • 原文地址:https://www.cnblogs.com/youxin/p/2667165.html
Copyright © 2011-2022 走看看