第三十七章 SQL函数 CURRENT_TIMESTAMP

[toc]

第三十七章 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函数插入当前系统日期和时间作为默认值。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容