文章
姚 鑫 · 四月 1 阅读大约需 4 分钟

第九十九章 SQL函数 NOW

第九十九章 SQL函数 NOW

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

大纲

NOW()

{fn NOW}
{fn NOW()}

描述

NOW 不接受任何参数。参数括号对于 ODBC 标量语法是可选的;它们对于 SQL 标准函数语法是必需的。

NOW 以时间戳的形式返回该时区的当前本地日期和时间;它会根据本地时间变体进行调整,例如夏令时。

NOW 可以返回 %TimeStamp 数据类型格式 (yyyy-mm-dd hh:mm:ss.ffff) 或 %PosixTime 数据类型格式(编码的 64 位有符号整数)的时间戳。以下规则确定返回的时间戳格式:

  1. 如果当前时间戳提供给数据类型为 %PosixTime 的字段,则当前时间戳值以 POSIXTIME 数据类型格式返回。例如,WHERE PosixField=NOW()INSERT INTO MyTable (PosixField) VALUES (NOW())
  2. 如果当前时间戳提供给数据类型为 %TimeStamp 的字段,则当前时间戳值以 TIMESTAMP 数据类型格式 (yyyy-mm-dd hh:mm:ss) 返回。它的 ODBC 类型是 TIMESTAMPLENGTH16PRECISION19。小时以 24 小时格式表示。所有字段都保留前导零。例如,WHERE TSField=NOW()INSERT INTO MyTable (TSField) VALUES (NOW())
  3. 如果在没有上下文的情况下提供当前时间戳,则以 TIMESTAMP 数据类型格式返回当前时间戳值。例如SELECT NOW()

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

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

精度的小数秒

默认情况下,NOW 不返回小数秒的精度。它不支持精确参数。但是,通过更改系统范围的默认时间精度,可以使系统范围内的所有 NOW 函数返回此配置的小数秒精度位数。系统范围默认时间精度的初始配置设置为 0(无小数秒);最高设置为 9。

GETDATE 在功能上与 NOW 相同,只是 GETDATE 提供了一个精度参数,允许覆盖系统范围的默认时间精度;如果省略精度参数,则 GETDATE 采用配置的系统范围的默认时间精度。

CURRENT_TIMESTAMP 有两种语法形式: 没有参数括号,CURRENT_TIMESTAMP 在功能上与 NOW 相同。带参数括号的 CURRENT_TIMESTAMP(precision) 在功能上与 GETDATE 相同,只是 CURRENT_TIMESTAMP()精度参数是强制性的。 CURRENT_TIMESTAMP() 始终返回其指定的精度并忽略配置的系统范围默认时间精度。

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

SYSDATE 在功能上与无参数的 CURRENT_TIMESTAMP 函数相同。

其他当前时间和日期功能

NOWGETDATECURRENT_TIMESTAMPSYSDATE 都根据本地时区设置返回当前本地日期和时间。

GETUTCDATE 以时间戳的形式返回当前的通用时间常数(UTC) 日期和时间。由于 UTC 时间不依赖于本地时区,并且不受本地时间变量(例如夏令时)的影响,因此该功能对于在不同时区的用户访问同一数据库时应用一致的时间戳很有用。 GETUTCDATE 支持小数秒精度。当前的 UTC 时间戳也由 ObjectScript $ZTIMESTAMP 特殊变量提供。

要仅返回当前日期,请使用 CURDATECURRENT_DATE。要仅返回当前时间,请使用 CURRENT_TIMECURTIME。这些函数使用 DATETIME 数据类型。 TIMEDATE 数据类型将它们的值存储为 $HOROLOG 格式的整数。这些函数都不支持精度。

示例

下面的例子显示了这三种语法形式是等价的; all 返回当前的本地日期和时间作为时间戳:

SELECT NOW(),{fn NOW},{fn NOW()}

2022/3/16 10:08:51  2022/3/16 10:08:51  2022/3/16 10:08:51

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

/// d ##class(PHA.TEST.SQLFunction).Now()
ClassMethod Now()
{
    &sql(
        SELECT NOW(),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.SQLFunction).Now()

Local timestamp is:  2022-03-16 10:09:42
UTC timestamp is:    2022-03-16 02:09:42
$ZTIMESTAMP is:      2022-03-16 02:09:42.584

以下示例将 Orders 表的选定行中的 LastUpdate 字段设置为当前系统日期和时间:

UPDATE Orders SET LastUpdate = {fn NOW()}
  WHERE Orders.OrderNumber=:ord
0
0 10
讨论 (0)1
登录或注册以继续