精华内容
下载资源
问答
  • timestamp
    千次阅读
    2021-02-01 19:03:04

    在本教程中,您将了解MySQL TIMESTAMP和TIMESTAMP列的功能,如使用时间戳自动初始化和更新。

    MySQL TIMESTAMP简介

    MySQL TIMESTAMP是一种保存日期和时间组合的时间数据类型。 TIMESTAMP列的格式为YYYY-MM-DD HH:MM:SS,固定为19个字符。

    TIMESTAMP值的范围从'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC。

    当您将TIMESTAMP值插入到表中时,MySQL会将其从连接的时区转换为UTC后进行存储。 当您查询TIMESTAMP值时,MySQL会将UTC值转换回连接的时区。请注意,对于其他时间数据类型(如DATETIME),不会进行此转换。

    当检索由不同时区中的客户端插入TIMESTAMP值时,将获得存储数据库中不同的值。 只要不更改时区,就可以获得与存储的相同的TIMESTAMP值。

    MySQL TIMESTAMP时区示例

    我们来看一个例子来看看MySQL如何处理TIMESTAMP值。

    首先,创建一个名为test_timestamp的新表,该表具有一列:t1,其数据类型为TIMESTAMP;

    USE testdb;

    CREATE TABLE IF NOT EXISTS test_timestamp (

    t1 TIMESTAMP

    );

    其次,使用SET time_zone语句将时区设置为"+00:00"UTC。

    SET time_zone='+00:00';

    第三,将TIMESTAMP值插入到test_timestamp表中。

    INSERT INTO test_timestamp

    VALUES('2018-01-01 00:00:01');

    第四,从test_timestamp表中查询选择TIMESTAMP值。

    SELECT

    t1

    FROM

    test_timestamp;

    +---------------------+

    | t1 |

    +---------------------+

    | 2018-01-01 00:00:01 |

    +---------------------+

    1 row in set

    第五,将会话时区设置为不同的时区,以查看从数据库服务器返回的值:

    SET time_zone ='+03:00';

    SELECT t1

    FROM test_timestamp;

    执行上面查询语句,得到以下结果 -

    +---------------------+

    | t1 |

    +---------------------+

    | 2018-01-01 03:00:01 |

    +---------------------+

    1 row in set

    如上面所见,查询结果集中为调整到新时区的不同时间值。

    将TIMESTAMP列的自动初始化和更新

    下面,我们从一个例子开始。以下语句创建一个名为categories的表:

    USE testdb;

    CREATE TABLE categories (

    id INT AUTO_INCREMENT PRIMARY KEY,

    name VARCHAR(255) NOT NULL,

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

    );

    在类别表中,created_at列是一个TIMESTAMP列,其默认值设置为CURRENT_TIMESTAMP。

    以下语句向categories表中插入一个新行,而不指定created_at列的值:

    INSERT INTO categories(name)

    VALUES ('A');

    SELECT

    *

    FROM

    categories;

    执行上面查询语句,得到以下结果 -

    +----+------+---------------------+

    | id | name | created_at |

    +----+------+---------------------+

    | 1 | A | 2017-07-25 21:52:46 |

    +----+------+---------------------+

    1 row in set

    可以看到,MySQL使用时间戳(在插入行时)为created_at列初始化。

    因此,TIMESTAMP列可以自动初始化为指定列插入行的当前时间戳作为一个值。此功能称为自动初始化。

    我们将添加一个名为updated_at,数据类型为TIMESTAMP的新列到categories表中。

    ALTER TABLE categories

    ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

    updated_at列的默认值为CURRENT_TIMESTAMP。 但是,在DEFAULT CURRENT_TIMESTAMP子句之后又有一个子句ON UPDATE CURRENT_TIMESTAMP。下面我们来看看它表示什么意思。

    以下语句将一个新行插入到categories表中。

    INSERT INTO categories(name)

    VALUES('B');

    SELECT * FROM categories;

    执行上面查询语句,得到以下结果 -

    +----+------+---------------------+---------------------+

    | id | name | created_at | updated_at |

    +----+------+---------------------+---------------------+

    | 1 | A | 2017-07-25 21:52:46 | 2017-07-25 21:53:16 |

    | 2 | B | 2017-07-25 21:53:25 | 2017-07-25 21:53:25 |

    +----+------+---------------------+---------------------+

    2 rows in set

    created_at列的默认值是插入行的时间戳。

    现在,我们更新id=2的行的name列中的值,并从categories表更新查询数据。

    UPDATE categories

    SET

    name = 'B+'

    WHERE

    id = 2;

    查询更新结果 -

    SELECT

    *

    FROM

    categories

    WHERE

    id = 2;

    执行上面查询语句,得到以下结果 -

    +----+------+---------------------+---------------------+

    | id | name | created_at | updated_at |

    +----+------+---------------------+---------------------+

    | 2 | B | 2017-07-25 21:53:25 | 2017-07-25 21:53:25 |

    +----+------+---------------------+---------------------+

    1 row in set

    请注意,updated_at列中的值在更新行时自动更改了时间戳。

    当行中任何其他列中的值从其当前值更改时,TIMESTAMP列的功能将自动更新为当前时间戳,这种行为称为自动更新。

    updated_at列被称为自动更新列。

    请注意,如果执行UPDATE语句以更新name列的相同值,则updated_at列将不会更新。

    UPDATE categories

    SET

    name = 'B+'

    WHERE

    id = 2;

    updated_at列的值保持不变。

    有关自动初始化和更新的更多信息,请查看MySQL网站上的时间初始化。

    从MySQL 5.6.5开始,DATETIME列还具有自动初始化和更新功能。此外,DEFAULT_CURRENT_TIMESTAMP和ON UPDATE CURRENT TIMESTAMP可以应用于多个列。

    在本教程中,我们向您介绍了MySQL TIMESTAMP数据类型,并向您展示了如何使用TIMESTAMP列的自动初始化和更新功能。

    ¥ 我要打赏

    纠错/补充

    收藏

    加QQ群啦,易百教程官方技术学习群

    注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

    更多相关内容
  • 主要介绍了MySQL错误TIMESTAMP column with CURRENT_TIMESTAMP的解决方法,需要的朋友可以参考下
  • 在MySQL 5.6.6之前,TIMESTAMP的默认行为: ■TIMESTAMP列如果没有明确声明NULL属性,默认为NOT NULL。(而其他数据类型,如果没有显示声明为NOT NULL,则允许NULL值。)设置TIMESTAMP的列值为NULL,会自动存储为...
  • 主要为大家详细介绍了python timestamp和datetime之间转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 文章目录Timestamptimestamp.go如何使用 Timestamp path: google/protobuf/timestamp.proto 在 timestamppb 中 Timestamp 包含两个字段 seconds 表示秒 nanos 表示纳秒 message Timestamp { int64 seconds = 1; ...
  • 不懂这块的看看啦,mysql中中四中时间类型之一的TimeStamp,在项目中的简单运用,如何将TimeStamp转换成自己需要的时间格式
  • unique.timestamp-开源

    2021-05-03 10:01:08
    unique.timestamp提供了通用的唯一标识符,这也是人类可读的时间戳。 它包括一个命令行可执行文件,一组用于嵌入到您自己的代码中的C例程以及一些用于操纵唯一时间戳的实用程序。
  • 前段时间,系统MySQL从5.5升级到了5.6,系统出现了大量的异常。大部分异常引起原因是由于TIMESTAMP的行为发生了变化,下面通过此篇文章给大家详解MySQL 5.6 中 TIMESTAMP有那些变化,需要的朋友可以参考下
  • mysql TIMESTAMP(时间戳)详解

    千次阅读 2021-01-18 23:58:07
    TIMESTAMP的变体1,TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP在创建新记录和修改现有记录的时候都对这个数据列刷新2,TIMESTAMP DEFAULT CURRENT_TIMESTAMP 在创建新记录的时候把这个字段...

    TIMESTAMP的变体

    1,TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

    在创建新记录和修改现有记录的时候都对这个数据列刷新

    2,TIMESTAMP DEFAULT CURRENT_TIMESTAMP  在创建新记录的时候把这个

    字段设置为当前时间,但以后修改时,不再刷新它

    3,TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  在创建新记录的时候把这个字段设置为0,

    以后修改时刷新它

    4,TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE CURRENT_TIMESTAMP

    在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它

    MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认值为当前更新日期

    与时间的功能,你可以使用TIMESTAMP列类型下面就详细说明TIMESTAMP列类型

    *TIMESTAMP列类型*

    TIMESTAMP值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示。

    TIMESTAMP值显示尺寸的格式如下表所示:

    +---------------+----------------+

    | 列类型    | 显示格式    |

    | TIMESTAMP(14) | YYYYMMDDHHMMSS |

    | TIMESTAMP(12) | YYMMDDHHMMSS  |

    | TIMESTAMP(10) | YYMMDDHHMM   |

    | TIMESTAMP(8) | YYYYMMDD    |

    | TIMESTAMP(6) | YYMMDD     |

    | TIMESTAMP(4) | YYMM      |

    | TIMESTAMP(2) | YY       |

    +---------------+----------------+

    “完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的显示尺寸

    创造最常见的显示尺寸是6、8、12、和14。

    你可以在创建表时指定一个任意的显示尺寸,但是定义列长为0或比14大均会被强制定义为列长14。

    列长在从1~13范围的奇数值尺寸均被强制为下一个更大的偶数。

    *列如:*

    定义字段长度   强制字段长度

    TIMESTAMP(0) -> TIMESTAMP(14)

    TIMESTAMP(15)-> TIMESTAMP(14)

    TIMESTAMP(1) -> TIMESTAMP(2)

    TIMESTAMP(5) -> TIMESTAMP(6)

    所有的TIMESTAMP列都有同样的存储大小,使用被指定的时期时间值的完整精度

    (14位)存储合法的值不考虑显示尺寸。不合法的日期,将会被强制为0存储

    *这有几个含意:

    1、虽然你建表时定义了列TIMESTAMP(8),但在你进行数据插入与更新时TIMESTAMP列

    实际上保存了14位的数据(包括年月日时分秒),只不过在你进行查询时MySQL返回给

    你的是8位的年月日数据。如果你使用ALTER TABLE拓宽一个狭窄的TIMESTAMP列,

    以前被“隐蔽”的信息将被显示。

    2、同样,缩小一个TIMESTAMP列不会导致信息失去,除了感觉上值在显示时,

    较少的信息被显示出。

    3、尽管TIMESTAMP值被存储为完整精度,直接操作存储值的唯一函数是UNIX_TIMESTAMP();

    由于MySQL返回TIMESTAMP列的列值是进过格式化后的检索的值,这意味着你可能不能使用某些函数来操作TIMESTAMP列(例如HOUR()或SECOND()),除非TIMESTAMP值的相关部分被包含在格式化的值中。

    例如,一个TIMESTAMP列只有被定义为TIMESTAMP(10)以上时,TIMESTAMP列的HH部分才会被显示,

    因此在更短的TIMESTAMP值上使用HOUR()会产生一个不可预知的结果。

    4、不合法TIMESTAMP值被变换到适当类型的“零”值(00000000000000)。(DATETIME,DATE亦然)

    *你可以使用下列语句来验证:*

    CREATE TABLE test ('id' INT (3) UNSIGNED AUTO_INCREMENT, 'date1'

    TIMESTAMP (8) PRIMARY KEY('id'));

    INSERT INTO test SET id = 1;

    SELECT * FROM test;

    +----+----------------+

    | id | date1     |

    +----+----------------+

    | 1 | 20021114    |

    +----+----------------+

    ALTER TABLE test CHANGE 'date1' 'date1' TIMESTAMP(14);

    SELECT * FROM test;

    +----+----------------+

    | id | date1     |

    +----+----------------+

    | 1 | 20021114093723 |

    +----+----------------+

    你可以使用TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作。

    如果你有多个TIMESTAMP列,只有第一个自动更新。自动更新第一个TIMESTAMP列在下列任何条件下发生:

    1、列值没有明确地在一个INSERT或LOAD DATA INFILE语句中指定。

    2、列值没有明确地在一个UPDATE语句中指定且另外一些的列改变值。(注意一个UPDATE

    设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为

    它当前的值,MySQL为了效率而忽略更改。)

    3、你明确地设定TIMESTAMP列为NULL.

    4、除第一个以外的TIMESTAMP列也可以设置到当前的日期和时间,只要将列设为NULL,或NOW()。

    CREATE TABLE test (  www.2cto.com

    'id' INT (3) UNSIGNED AUTO_INCREMENT,

    'date1' TIMESTAMP (14),

    'date2' TIMESTAMP (14),

    PRIMARY KEY('id')

    );

    INSERT INTO test (id, date1, date2) VALUES (1, NULL, NULL);

    INSERT INTO test SET id= 2;

    +----+----------------+----------------+

    | id | date1     | date2     |

    +----+----------------+----------------+

    | 1 | 20021114093723 | 20021114093723 |

    | 2 | 20021114093724 | 00000000000000 |

    +----+----------------+----------------+

    ->第一条指令因设date1、date2为NULL,所以date1、date2值均为当前时间第二条指令

    因没有设date1、date2列值,第一个TIMESTAMP列date1为更新为当前时间,

    而二个TIMESTAMP列date2因日期不合法而变为“00000000000000”

    UPDATE test SET id= 3 WHERE id=1;

    +----+----------------+----------------+

    | id | date1     | date2     |

    +----+----------------+----------------+

    | 3 | 20021114094009 | 20021114093723 |

    | 2 | 20021114093724 | 00000000000000 |

    +----+----------------+----------------+

    ->这条指令没有明确地设定date2的列值,所以第一个TIMESTAMP列date1将被更新为当前时间

    UPDATE test SET id= 1,date1=date1,date2=NOW() WHERE id=3;  www.2cto.com

    +----+----------------+----------------+

    | id | date1     | date2     |

    +----+----------------+----------------+

    | 1 | 20021114094009 | 20021114094320 |

    | 2 | 20021114093724 | 00000000000000 |

    +----+----------------+----------------+

    ->这条指令因设定date1=date1,所以在更新数据时date1列值并不会发生改变而

    因设定date2=NOW(),所以在更新数据时date2列值会被更新为当前时间此指令等效为

    UPDATE test SET id= 1,date1=date1,date2=NULL WHERE id=3;

    因MySQL返回的 TIMESTAMP 列为数字显示形式,你可以用DATE_FROMAT()函数来格式化 TIMESTAMP 列

    SELECT id,DATE_FORMAT(date1,'%Y-%m-%d %H:%i:%s') As date1,

    DATE_FORMAT(date2,'%Y-%m-%d %H:%i:%s') As date2 FROM test;

    +----+---------------------+---------------------+

    | id | date1        | date2        |

    +----+---------------------+---------------------+

    | 1 | 2002-11-14 09:40:09 | 2002-11-14 09:43:20 |

    | 2 | 2002-11-14 09:37:24 | 0000-00-00 00:00:00 |

    +----+---------------------+---------------------+

    SELECT id,DATE_FORMAT(date1,'%Y-%m-%d') As date1,

    DATE_FORMAT(date2,'%Y-%m-%d') As date2 FROM test;

    www.2cto.com

    +----+-------------+-------------+

    | id | date1    | date2    |

    +----+-------------+-------------+

    | 1 | 2002-11-14 | 2002-11-14 |

    | 2 | 2002-11-14 | 0000-00-00 |

    +----+-------------+-------------+

    在某种程度上,你可以把一种日期类型的值赋给一个不同的日期类型的对象。

    然而,而尤其注意的是:值有可能发生一些改变或信息的损失:

    1、如果你将一个DATE值赋给一个DATETIME或TIMESTAMP对象,结果值的时间部分被

    设置为'00:00:00',因为DATE值中不包含有时间信息。

    2、如果你将一个DATETIME或TIMESTAMP值赋给一个DATE对象,结果值的时间部分被删除,

    因为DATE类型不存储时间信息。

    3、尽管DATETIME, DATE和TIMESTAMP值全都可以用同样的格式集来指定,

    但所有类型不都有同样的值范围。

    例如,TIMESTAMP值不能比1970早,也不能比2037晚,这意味着,一个日期例如'1968-01-01',

    当作为一个DATETIME或DATE值时它是合法的,但它不是一个正确TIMESTAMP值!

    并且如果将这样的一个对象赋值给TIMESTAMP列,它将被变换为0。  www.2cto.com

    *当指定日期值时,当心某些缺陷: *

    1、允许作为字符串指定值的宽松格式能被欺骗。例如,,因为“:”分隔符的使用,

    值'10:11:12'可能看起来像时间值,但是如果在一个日期中使用,上下文将作为年份被

    解释成'2010-11-12'。值'10:45:15'将被变换到'0000-00-00',因为'45'不是一个合法的月份。

    2、以2位数字指定的年值是模糊的,因为世纪是未知的。MySQL使用下列规则解释2位年值:

    在00-69范围的年值被变换到2000-2069。 在范围70-99的年值被变换到1970-1999。

    展开全文
  • 第三十七章 SQL函数 CURRENT_TIMESTAMP

    千次阅读 2022-01-29 08:51:07
    文章目录第三十七章 SQL函数 CURRENT_TIMESTAMP大纲参数描述精确到小数部分的秒配置精度日期和时间函数比较示例 第三十七章 SQL函数 CURRENT_TIMESTAMP 日期/时间函数,返回当前本地日期和时间。 大纲 CURRENT_...

    第三十七章 SQL函数 CURRENT_TIMESTAMP

    日期/时间函数,返回当前本地日期和时间。

    大纲

    CURRENT_TIMESTAMP
    CURRENT_TIMESTAMP(precision)
    

    参数

    • precision - 一个正整数,它将时间精度指定为小数秒的位数。
      默认值是0(没有小数秒);
      这个默认值是可配置的。

    CURRENT_TIMESTAMP返回TIMESTAMP数据类型。

    描述

    CURRENT_TIMESTAMP要么不接受参数,要么接受精度参数。
    不允许使用空参数括号。

    CURRENT_TIMESTAMP返回当前时区的本地日期和时间;
    它会根据当地的时间变化进行调整,例如日光节约时间。

    CURRENT_TIMESTAMP可以返回%timestamp数据类型格式(yyyy-mm-dd hh:mm:ss.ffff)%PosixTime数据类型格式(编码的64位带符号整数)的时间戳。
    以下规则决定返回哪种时间戳格式:

    1. 如果将当前时间戳提供给数据类型为%PosixTime的字段,则当前时间戳值将以PosixTime数据类型格式返回。
      例如,WHERE PosixField=CURRENT_TIMESTAMP or INSERT INTO MyTable (PosixField) VALUES (CURRENT_TIMESTAMP).

    2. 如果将当前的时间戳提供给数据类型为%timestamp的字段,则以timestamp数据类型格式返回当前的时间戳值。
      例如WHERE TSField=CURRENT_TIMESTAMP or INSERT INTO MyTable (TSField) VALUES (CURRENT_TIMESTAMP).

    3. 如果没有上下文提供当前时间戳,则以timestamp数据类型格式返回当前时间戳值。
      例如:SELECT CURRENT_TIMESTAMP

    可以使用$HOROLOG以内部格式存储或返回当前本地日期和时间。

    要更改默认的datetime字符串格式,使用SET OPTION命令和各种日期和时间选项。

    当使用CREATE TABLEALTER TABLE定义datetime字段时,可以指定CURRENT_TIMESTAMP(带精度或不带精度)作为字段的默认值。
    CURRENT_TIMESTAMP可以被指定为数据类型为%Library的字段的默认值。
    PosixTime%Library.TimeStamp;
    当前日期和时间以字段的数据类型指定的格式存储。

    精确到小数部分的秒

    CURRENT_TIMESTAMP有两种语法形式:

    • 如果没有参数括号,CURRENT_TIMESTAMP在功能上与NOW相同。
      它使用系统范围内的默认时间精度。
    • 带有圆括号的参数CURRENT_TIMESTAMP(precision)在功能上与GETDATE相同,除了CURRENT_TIMESTAMP()精度参数是强制性的。
      CURRENT_TIMESTAMP()总是返回指定的精度,并忽略配置的系统范围内的缺省时间精度。

    分数秒总是被截断,而不是四舍五入到指定的精度。

    • TIMESTAMP数据类型格式中,精度的最大可能数字是9。
      实际支持的数字数由precision参数、配置的默认时间精度和系统能力决定。
      如果指定的精度大于配置的默认时间精度,则精度的其他数字将作为尾随零返回。
    • POSIXTIME数据类型格式中,精度的最大可能数字为6
      每个POSIXTIME值使用6位精度计算;
      除非提供,否则这些小数数字默认为零。
      实际支持的非零位数由precision参数、配置的缺省时间精度和系统能力决定。

    配置精度

    默认精度可以通过以下方式配置:

    • 使用TIME_PRECISION选项设置OPTION
    • 系统范围的$SYSTEM.SQL.Util.SetOption()方法配置选项DefaultTimePrecision
      要确定当前设置,调用$SYSTEM.SQL.CurrentSettings(),它显示默认的时间精度;
      默认值为0。
    • 进入管理门户,选择“系统管理”、“配置”、“SQL和对象设置”、“SQL”。
      查看和编辑GETDATE()CURRENT_TIMECURRENT_TIMESTAMP的默认时间精度的当前设置。

    指定从09(包括9)的整数,作为返回的十进制精度的默认位数。
    默认值为0
    实际返回的精度取决于平台;
    超过系统中可用精度的精度数字将作为零返回。

    日期和时间函数比较

    GETDATENOW也可用于返回当前本地日期和时间,作为TIMESTAMP数据类型或POSIXTIME数据类型值。
    GETDATE支持精度,NOW不支持精度。

    SYSDATECURRENT_TIMESTAMP相同,只是SYSDATE不支持精度。
    CURRENT_TIMESTAMP是首选的SQL函数;
    提供SYSDATE是为了与其他厂商兼容。

    GETUTCDATE可以作为TIMESTAMP数据类型或POSIXTIME数据类型值返回通用的(与时区无关的)日期和时间。
    请注意,除了GETUTCDATE之外,所有 SQL时间和日期函数都特定于当地时区设置。
    要获得一个通用的(独立于时区的)时间戳,你可以使用GETUTCDATE或者ObjectScript $ZTIMESTAMP特殊变量。

    要只返回当前本地日期,请使用CURDATECURRENT_DATE
    要只返回当前本地时间,请使用CURRENT_TIMECURTIME
    这些函数返回DATETIME数据类型的值。
    这些函数都不支持精度。

    TIMESTAMP数据类型的存储格式和显示格式是相同的。
    POSIXTIME数据类型存储格式是一个编码的64位有符号整数。
    TIMEDATE数据类型将它们的值存储为$HOROLOG格式的整数;
    当在SQL中显示时,它们被转换为日期或时间显示格式。
    默认情况下,嵌入式SQL以逻辑(存储)格式返回。

    可以使用CASTCONVERT函数来更改日期和时间的数据类型。

    示例

    下面的例子以三种不同的方式返回当前本地日期和时间:TIMESTAMP数据类型格式,具有系统默认时间精度,具有两位小数秒的精度,以及$HOROLOG内部存储格式,具有全秒:

    SELECT 
       CURRENT_TIMESTAMP AS FullSecStamp,
       CURRENT_TIMESTAMP(2) AS FracSecStamp,
       $HOROLOG AS InternalFullSec
    

    下面的嵌入式SQL示例设置了区域设置的缺省时间精度。
    第一个CURRENT_TIMESTAMP没有指定精度;
    它返回带有默认时间精度的当前时间。
    第二个CURRENT_TIMESTAMP指定精度;
    这将覆盖配置的缺省时间精度。
    precision参数可以大于或小于默认的时间精度设置:

    ClassMethod CurrentTimestamp()
    {
    InitialVal
    	s pre = ##class(%SYS.NLS.Format).GetFormatItem("TimePrecision")
    ChangeVal
    	s x = ##class(%SYS.NLS.Format).SetFormatItem("TimePrecision",4)
    	&sql(SELECT CURRENT_TIMESTAMP,CURRENT_TIMESTAMP(2) INTO :a,:b)
    	if SQLCODE'=0 {
    		w !,"Error code ",SQLCODE }
    	else {
    	w !,"Timestamp is:  ",a
    	w !,"Timestamp is:  ",b }
    RestoreVal
    	s x = ##class(%SYS.NLS.Format).SetFormatItem("$TimePrecision",pre)
    }
    
    DHC-APP>d ##class(PHA.TEST.SQLCommand).CurrentTimestamp()
     
    Timestamp is:  2022-01-25 09:22:49
    Timestamp is:  2022-01-25 09:22:49.49
    

    下面的嵌入式SQL示例比较了本地(特定时区)和通用(独立时区)的时间戳:

    ClassMethod CurrentTimestamp1()
    {
    	&sql(SELECT CURRENT_TIMESTAMP,GETUTCDATE() INTO :a,:b)
    	IF SQLCODE'=0 {
    		w !,"Error code ",SQLCODE }
    	ELSE {
    		w !,"Local timestamp is:  ",a
    		w !,"UTC timestamp is:    ",b
    		w !,"$ZTIMESTAMP is:      ",$ZDATETIME($ZTIMESTAMP,3,,3)
     }
    
    DHC-APP>d ##class(PHA.TEST.SQLCommand).CurrentTimestamp1()
     
    Local timestamp is:  2022-01-25 09:23:58
    UTC timestamp is:    2022-01-25 01:23:58
    $ZTIMESTAMP is:      2022-01-25 01:23:58.568
    

    下面的示例将Orders表中所选行中的LastUpdate字段设置为当前系统日期和时间。
    如果LastUpdate是数据类型%TimeStamp, CURRENT_TIMESTAMP将返回当前日期和时间作为ODBC时间戳;
    如果LastUpdate是数据类型%PosixTime, CURRENT_TIMESTAMP返回当前日期和时间为编码的64位有符号整数:

    UPDATE Orders SET LastUpdate = CURRENT_TIMESTAMP
      WHERE Orders.OrderNumber=:ord
    

    下面的例子创建了一个名为Orders的表,记录收到的产品订单:

    CREATE TABLE Orders (
         OrderId     INT NOT NULL,
         ClientId    INT,
         ItemName    CHAR(40) NOT NULL,
         OrderDate   TIMESTAMP DEFAULT CURRENT_TIMESTAMP(3),
         PRIMARY KEY (OrderId))
    

    OrderDate列包含收到订单的日期和时间。
    它使用TIMESTAMP数据类型,并使用精度为3的CURRENT_TIMESTAMP函数插入当前系统日期和时间作为默认值。

    展开全文
  • 纯 C 语言实现的日期时间和timestamp互转的 API 调用,可用于嵌入式。函数名极简单明了,无文档。
  • mysql之TIMESTAMP(时间戳)用法详解

    千次阅读 2021-02-07 13:02:43
    一、TIMESTAMP的变体TIMESTAMP时间戳在创建的时候可以有多重不同的特性,如:1.在创建新记录和修改现有记录的时候都对这个数据列刷新:TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP2.在创建新...

    一、TIMESTAMP的变体

    TIMESTAMP时间戳在创建的时候可以有多重不同的特性,如:

    1.在创建新记录和修改现有记录的时候都对这个数据列刷新:

    TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

    2.在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它:

    TIMESTAMP DEFAULT CURRENT_TIMESTAMP

    3.在创建新记录的时候把这个字段设置为0,以后修改时刷新它:

    TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

    4.在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它:

    TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss' ON UPDATE CURRENT_TIMESTAMP

    MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认值为当前更新日期与时间的功能,你可以使用TIMESTAMP列类型,下面就详细说明TIMESTAMP列类型

    二、TIMESTAMP列类型

    TIMESTAMP值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示。

    TIMESTAMP值显示尺寸的格式如下表所示:

    +---------------+----------------+

    | 列类型    | 显示格式    |

    | TIMESTAMP(14) | YYYYMMDDHHMMSS |

    | TIMESTAMP(12) | YYMMDDHHMMSS  |

    | TIMESTAMP(10) | YYMMDDHHMM   |

    | TIMESTAMP(8) | YYYYMMDD    |

    | TIMESTAMP(6) | YYMMDD     |

    | TIMESTAMP(4) | YYMM      |

    | TIMESTAMP(2) | YY       |

    +---------------+----------------+

    “完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的显示尺寸,创造最常见的显示尺寸是6、8、12、和14。

    你可以在创建表时指定一个任意的显示尺寸,但是定义列长为0或比14大均会被强制定义为列长14。

    列长在从1~13范围的奇数值尺寸均被强制为下一个更大的偶数。

    列如:

    定义字段长度   强制字段长度

    TIMESTAMP(0) -> TIMESTAMP(14)

    TIMESTAMP(15)-> TIMESTAMP(14)

    TIMESTAMP(1) -> TIMESTAMP(2)

    TIMESTAMP(5) -> TIMESTAMP(6)

    所有的TIMESTAMP列都有同样的存储大小,使用被指定的时期时间值的完整精度(14位)存储合法的值不考虑显示尺寸。不合法的日期,将会被强制为0存储

    这有几个含意:

    1.虽然你建表时定义了列TIMESTAMP(8),但在你进行数据插入与更新时TIMESTAMP列实际上保存了14位的数据(包括年月日时分秒),只不过在你进行查询时MySQL返回给你的是8位的年月日数据。如果你使用ALTER TABLE拓宽一个狭窄的TIMESTAMP列,以前被“隐蔽”的信息将被显示。

    2.同样,缩小一个TIMESTAMP列不会导致信息失去,除了感觉上值在显示时,较少的信息被显示出。

    3.尽管TIMESTAMP值被存储为完整精度,直接操作存储值的唯一函数是UNIX_TIMESTAMP();由于MySQL返回TIMESTAMP列的列值是进过格式化后的检索的值,这意味着你可能不能使用某些函数来操作TIMESTAMP列(例如HOUR()或SECOND()),除非TIMESTAMP值的相关部分被包含在格式化的值中。

    例如,一个TIMESTAMP列只有被定义为TIMESTAMP(10)以上时,TIMESTAMP列的HH部分才会被显示,因此在更短的TIMESTAMP值上使用HOUR()会产生一个不可预知的结果。

    4.不合法TIMESTAMP值被变换到适当类型的“零”值(00000000000000)。(DATETIME,DATE亦然)

    例如你可以使用下列语句来验证:

    CREATE TABLE test ('id' INT (3) UNSIGNED AUTO_INCREMENT, 'date1'

    TIMESTAMP (8) PRIMARY KEY('id'));

    INSERT INTO test SET id = 1;

    SELECT * FROM test;

    +----+----------------+

    | id | date1     |

    +----+----------------+

    | 1 | 20021114    |

    +----+----------------+

    ALTER TABLE test CHANGE 'date1' 'date1' TIMESTAMP(14);

    SELECT * FROM test;

    +----+----------------+

    | id | date1     |

    +----+----------------+

    | 1 | 20021114093723 |

    +----+----------------+

    你可以使用TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作。

    如果你有多个TIMESTAMP列,只有第一个自动更新。自动更新第一个TIMESTAMP列在下列任何条件下发生:

    1.列值没有明确地在一个INSERT或LOAD DATA INFILE语句中指定。

    2.列值没有明确地在一个UPDATE语句中指定且另外一些的列改变值。(注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。)

    3.你明确地设定TIMESTAMP列为NULL.

    4.除第一个以外的TIMESTAMP列也可以设置到当前的日期和时间,只要将列设为NULL,或NOW()。

    CREATE TABLE test (

    'id' INT (3) UNSIGNED AUTO_INCREMENT,

    'date1' TIMESTAMP (14),

    'date2' TIMESTAMP (14),

    PRIMARY KEY('id')

    );

    INSERT INTO test (id, date1, date2) VALUES (1, NULL, NULL);

    INSERT INTO test SET id= 2;

    +----+----------------+----------------+

    | id | date1     | date2     |

    +----+----------------+----------------+

    | 1 | 20021114093723 | 20021114093723 |

    | 2 | 20021114093724 | 00000000000000 |

    +----+----------------+----------------+

    第一条指令因设date1、date2为NULL,所以date1、date2值均为当前时间第二条指令因没有设date1、date2列值,第一个TIMESTAMP列date1为更新为当前时间,而二个TIMESTAMP列date2因日期不合法而变为“00000000000000”

    UPDATE test SET id= 3 WHERE id=1;

    +----+----------------+----------------+

    | id | date1     | date2     |

    +----+----------------+----------------+

    | 3 | 20021114094009 | 20021114093723 |

    | 2 | 20021114093724 | 00000000000000 |

    +----+----------------+----------------+

    这条指令没有明确地设定date2的列值,所以第一个TIMESTAMP列date1将被更新为当前时间

    UPDATE test SET id= 1,date1=date1,date2=NOW() WHERE id=3;

    +----+----------------+----------------+

    | id | date1     | date2     |

    +----+----------------+----------------+

    | 1 | 20021114094009 | 20021114094320 |

    | 2 | 20021114093724 | 00000000000000 |

    +----+----------------+----------------+

    这条指令因设定date1=date1,所以在更新数据时date1列值并不会发生改变而因设定date2=NOW(),所以在更新数据时date2列值会被更新为当前时间此指令等效为:

    UPDATE test SET id= 1,date1=date1,date2=NULL WHERE id=3;

    因MySQL返回的 TIMESTAMP 列为数字显示形式,你可以用DATE_FROMAT()函数来格式化 TIMESTAMP 列,如下所示:

    SELECT id,DATE_FORMAT(date1,'%Y-%m-%d %H:%i:%s') As date1,

    DATE_FORMAT(date2,'%Y-%m-%d %H:%i:%s') As date2 FROM test;

    +----+---------------------+---------------------+

    | id | date1        | date2        |

    +----+---------------------+---------------------+

    | 1 | 2002-11-14 09:40:09 | 2002-11-14 09:43:20 |

    | 2 | 2002-11-14 09:37:24 | 0000-00-00 00:00:00 |

    +----+---------------------+---------------------+

    SELECT id,DATE_FORMAT(date1,'%Y-%m-%d') As date1,

    DATE_FORMAT(date2,'%Y-%m-%d') As date2 FROM test;

    +----+-------------+-------------+

    | id | date1    | date2    |

    +----+-------------+-------------+

    | 1 | 2002-11-14 | 2002-11-14 |

    | 2 | 2002-11-14 | 0000-00-00 |

    +----+-------------+-------------+

    在某种程度上,你可以把一种日期类型的值赋给一个不同的日期类型的对象。

    然而,而尤其注意的是:值有可能发生一些改变或信息的损失:

    1.如果你将一个DATE值赋给一个DATETIME或TIMESTAMP对象,结果值的时间部分被设置为'00:00:00',因为DATE值中不包含有时间信息。

    2.如果你将一个DATETIME或TIMESTAMP值赋给一个DATE对象,结果值的时间部分被删除,因为DATE类型不存储时间信息。

    3.尽管DATETIME, DATE和TIMESTAMP值全都可以用同样的格式集来指定,但所有类型不都有同样的值范围。

    例如,TIMESTAMP值不能比1970早,也不能比2037晚,这意味着,一个日期例如'1968-01-01',当作为一个DATETIME或DATE值时它是合法的,但它不是一个正确TIMESTAMP值!并且如果将这样的一个对象赋值给TIMESTAMP列,它将被变换为0。

    三、当指定日期值时,当心某些缺陷:

    1.允许作为字符串指定值的宽松格式能被欺骗。例如,因为“:”分隔符的使用,值'10:11:12'可能看起来像时间值,但是如果在一个日期中使用,上下文将作为年份被解释成'2010-11-12'。值'10:45:15'将被变换到'0000-00-00',因为'45'不是一个合法的月份。

    2.以2位数字指定的年值是模糊的,因为世纪是未知的。MySQL使用下列规则解释2位年值:

    在00-69范围的年值被变换到2000-2069。 在范围70-99的年值被变换到1970-1999。

    PS:这里再为大家推荐一个本站Unix时间戳转换工具,附带了各种语言下时间戳的操作方法,包括PHP、MySQL、SQL Server、java等的时间戳获取与转换操作技巧:

    Unix时间戳(timestamp)转换工具:http://tools.uoften.com/code/unixtime

    展开全文
  • mysql的timestamp会存在时区问题?

    千次阅读 2021-09-13 14:39:53
    timestamp没有时区问题,而datetime有时区问题,原因是timestamp是以UTC格式存储的,而datetime存储类似于时间字符串的形式,示例博文:MySQL 中 datetime 和 timestamp 的区别与选择 timestamp也有时区问题,示例...
  • Oracle Timestamp类型

    千次阅读 2021-05-01 07:20:11
    在本教程中将学习Oracle TIMESTAMP数据类型以及如何在Oracle数据库中有效处理TIMESTAMP数据。Oracle TIMESTAMP数据类型简介TIMESTAMP数据类型用于存储日期和时间数据,包括年,月,日,时,分和秒。另外,它存储小数...
  • 文章来介绍了mysql TIMESTAMP(时间戳) 的一用法特性以及...TIMESTAMP基础知识介绍TIMESTAMP的变体1,TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 在创建新记录和修改现有记录的时候都对这个数...
  • 时间戳timestamp类型

    万次阅读 2019-01-10 19:43:14
    时间戳timestamp类型 Timestamp ​ Mysql中timestamp的格式为"YYYY-MM-DD:HH-MM-SS",显示宽度是19个字符,如果你在insert的时候指定(null),那么它会自动显示为当前操作的时间。但是如果你在insert操作...
  • oracle日期时间型timestamp的深入理解

    千次阅读 2021-05-03 02:17:55
    oracle日期时间型timestamp的深入理解1、字符型转成timestamp复制代码 代码如下:select to_timestamp('01-10月-08 07.46.41.000000000 上午','dd-MON-yy hh:mi:ss.ff AM')from dual;2、timestamp转成date型复制代码 ...
  • MySQL时间戳(Timestamp)函数

    千次阅读 2021-01-18 19:32:05
    1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()mysql> select current_timestamp, current_timestamp();+———————+———————+| current_timestamp | current_timestamp() |+...
  • python datetime与timestamp

    千次阅读 2021-01-01 19:01:07
    把一个datetime类型转换为timestamp只需要简单调用timestamp()方法: >>> from datetime import datetime >>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime >>> dt.timestamp() # 把datetime...
  • datetime和timestamp的区别

    千次阅读 2020-06-30 08:53:28
    timestamp存储的时间与时区有关,变换时区数据会受影响;datetime与时间无关; timestamp存储时间范围小,1970-01-01 00:00:00到2038-01-19 03:14:07;datetime没有这个限制。 所以工作中要尽量用datetime。 时间...
  • mysql各版本timestamp默认值

    千次阅读 2021-12-11 01:19:34
    在MySQL上述三个大版本中,默认时间戳(Timestamp)类型的取值范围为’1970-01-01 00:00:01’ UTC 至’2038-01-19 03:14:07’ UTC,数据精确到秒级别,该取值范围包含约22亿个数值,因此在MySQL内部使用4个字节INT类型...
  • 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数...在MySQL上述三个大版本中,默认时间戳(Timestamp)类型的取值范围为’1970-01-01 00:00:01’ UTC 至’2038-0
  • timestamp和datetime的区别

    千次阅读 2022-03-18 09:35:14
    首先我们看一下timestamp与datetime的对比如下: 对比 timestamp datetime 存储空间 TIMESTAMP占用4个字节 DATETIME占用8个字节 时区 TIMESTAMP实际记录的是1970-01-01 00:00:01到现在的数数,受时区影响 ...
  • } 两条sql语句 creat_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 即: 数据创建时间用 ...
  • Oracle TIMESTAMP数据类型

    千次阅读 2021-05-04 06:48:30
    TIMESTAMP数据类型:Oracle定义语法:TIMESTAMP [(fractional_seconds_precision)]fractional_seconds_precision 的范围为0到9, 默认为6. 与DATE类型相比该类型可以保存到微秒. 而且微秒的精确范围可以保存到0到9为...
  • ICMP timestamp 协议原理和实现

    千次阅读 2019-02-09 17:56:07
    其中它的type值域对于request来说要设置成12,对于reply要设置成14,sequence number 和identifier 意义与上一节描述的一样,original timestamp 用于发起者填写自己的当前时间,接下来的两个时间戳由接收者填写,...
  • 满意答案wbbyouxi2016.08.17采纳率:54%等级:10已帮助:4224人IMESTAMP的变体1,TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP在创建新记录和修改现有记录的时候都对这个数据列刷新2,...
  • oracle的timestamp类型使用 毫秒

    千次阅读 2021-05-01 08:08:45
    我们都知道date和timestamp都是对日期和时间的表示,只是两种类型的精确度不同,前者精确到秒,后者精确到小数秒(fractional_seconds_precision),可以是0 to 9,缺省是6。但是对date类型的运算很简单,有很多函数...
  • JAVA日期处理(Timestamp

    万次阅读 2021-02-27 12:31:52
    要写一些与数据库连接时的日期处理,pstmt.setDate()的类型是java.sql.Date类型,这种符合规范的类型其实并没有把时分秒存进数据库,所以存取时就应该用setTimestamp()或getTimestamp()。整理一:一、往数据库里存...
  • 千万注意的是一个表中出现了两个timestamp字段类型:我测试了一下,如果你的表中有两个timestamp字段,只要你更新任何非timestamp字段的值,则第一个timestamp列会更新成当前时间,而第二人timestamp列的值不变。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 587,988
精华内容 235,195
关键字:

timestamp