第九十九章 SQL函数 NOW
返回当前本地日期和时间的日期/时间函数。
大纲
NOW()
{fn NOW}
{fn NOW()}
描述
NOW
不接受任何参数。参数括号对于 ODBC
标量语法是可选的;它们对于 SQL 标准函数语法是必需的。
NOW
以时间戳的形式返回该时区的当前本地日期和时间;它会根据本地时间变体进行调整,例如夏令时。
NOW
可以返回 %TimeStamp
数据类型格式 (yyyy-mm-dd hh:mm:ss.ffff
) 或 %PosixTime
数据类型格式(编码的 64
位有符号整数)的时间戳。以下规则确定返回的时间戳格式:
- 如果当前时间戳提供给数据类型为
%PosixTime
的字段,则当前时间戳值以POSIXTIME
数据类型格式返回。例如,WHERE PosixField=NOW()
或INSERT INTO MyTable (PosixField) VALUES (NOW())
。 - 如果当前时间戳提供给数据类型为
%TimeStamp
的字段,则当前时间戳值以TIMESTAMP
数据类型格式 (yyyy-mm-dd hh:mm:ss
) 返回。它的 ODBC 类型是TIMESTAMP
,LENGTH
是16
,PRECISION
是19
。小时以24
小时格式表示。所有字段都保留前导零。例如,WHERE TSField=NOW()
或INSERT INTO MyTable (TSField) VALUES (NOW())
。 - 如果在没有上下文的情况下提供当前时间戳,则以
TIMESTAMP
数据类型格式返回当前时间戳值。例如SELECT NOW()
。
要更改默认日期时间字符串格式,请使用带有各种日期和时间选项的 SET OPTION
命令。
可以使用 CAST
或 CONVERT
函数更改时间戳、日期和时间的数据类型。
精度的小数秒
默认情况下,NOW
不返回小数秒的精度。它不支持精确参数。但是,通过更改系统范围的默认时间精度,可以使系统范围内的所有 NOW
函数返回此配置的小数秒精度位数。系统范围默认时间精度的初始配置设置为 0
(无小数秒);最高设置为 9。
GETDATE
在功能上与 NOW
相同,只是 GETDATE
提供了一个精度参数,允许覆盖系统范围的默认时间精度;如果省略精度参数,则 GETDATE
采用配置的系统范围的默认时间精度。
CURRENT_TIMESTAMP
有两种语法形式: 没有参数括号,CURRENT_TIMESTAMP
在功能上与 NOW
相同。带参数括号的 CURRENT_TIMESTAMP(precision)
在功能上与 GETDATE
相同,只是 CURRENT_TIMESTAMP()
精度参数是强制性的。 CURRENT_TIMESTAMP()
始终返回其指定的精度并忽略配置的系统范围默认时间精度。
小数秒总是被截断而不是四舍五入到指定的精度。
SYSDATE
在功能上与无参数的 CURRENT_TIMESTAMP
函数相同。
其他当前时间和日期功能
NOW
、GETDATE
、CURRENT_TIMESTAMP
和 SYSDATE
都根据本地时区设置返回当前本地日期和时间。
GETUTCDATE
以时间戳的形式返回当前的通用时间常数(UTC)
日期和时间。由于 UTC
时间不依赖于本地时区,并且不受本地时间变量(例如夏令时)的影响,因此该功能对于在不同时区的用户访问同一数据库时应用一致的时间戳很有用。 GETUTCDATE
支持小数秒精度。当前的 UTC
时间戳也由 ObjectScript $ZTIMESTAMP
特殊变量提供。
要仅返回当前日期,请使用 CURDATE
或 CURRENT_DATE
。要仅返回当前时间,请使用 CURRENT_TIME
或 CURTIME
。这些函数使用 DATE
或 TIME
数据类型。 TIME
和 DATE
数据类型将它们的值存储为 $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
网友评论