文章目录


第六十二章 SQL函数 HOUR

Time函数,它返回DateTime表达式的小时数。

大纲

{fn HOUR(time-expression)}
  • ​time-expression​​​ - 作为列名、另一个标量函数的结果或字符串或数字文字的表达式。它必须解析为日期时间字符串或时间整数,其中基础数据类型可以表示为​​%Time​​​、​​%Timestamp​​​或​​%PosiTime​​。

描述

​Hour​​​返回一个整数,指定给定时间或日期时间值的小时。小时是根据​​$HOROLOG​​​或​​$ZTIMESTAMP​​​值、​​ODBC​​格式的日期字符串或时间戳计算的。

时间表达式时间戳可以是数据类型​​%Library.PosiTime​​​(编码的64位有符号整数),也可以是数据类型​​%Library.TimeStamp(yyyy-mm-dd hh:mm:ss.fff)​​。

要更改此默认时间格式,请使用​​SET OPTION​​命令。

请注意,可以提供时间整数(已用秒数),但不能提供时间字符串(​​hh:mm:ss​​​)。必须提供日期时间字符串(​​yyyy-mm-dd hh:mm:ss​​​)。可以省略日期时间字符串的秒(​​:ss​​​)或分钟和秒(​​mm:ss​​)部分,但仍返回小时部分。日期时间字符串的时间部分必须是有效的时间值。未验证日期时间字符串的日期部分。

小时以​​24​​​小时表示。小时数(​​HH​​)部分应该是介于0到23之间的整数。输入上的前导零是可选的;输出上不显示前导零。

当小时部分为​​“0”​​​或​​“00”​​​时,小时返回​​0​​​小时的值。如果没有提供时间表达式,或者如果省略了时间表达式的小时部分(​​':mm:ss'​​​或​​'::ss'​​),也会返回零小时。

同时可以使用​​DATEPART​​​或​​DATENAME​​返回信息。

也可以使用 ​​HOUR()​​方法调用从ObjectScript调用此函数:

$SYSTEM.SQL.Functions.HOUR(time-expression)

示例

以下示例均返回数字​​18​​​,因为时间表达式值为​​18:45:38​​:

SELECT {fn HOUR('2017-02-16 18:45:38')} AS ODBCHour

18
SELECT {fn HOUR(67538)} AS HorologHour

18

下面的示例也返回​​18​​。时间值的秒(或分和秒)部分可以省略。

SELECT {fn HOUR('2017-02-16 18:45')} AS Hour_Given

18

下面的示例返回​​0​​小时,因为日期时间字符串的时间部分已被省略:

SELECT {fn HOUR('2017-02-16')} AS Hour_Given

0

以下示例均返回当前时间的小时部分:

SELECT {fn HOUR(CURRENT_TIME)} AS H_CurrentT,
{fn HOUR({fn CURTIME()})} AS H_CurT,
{fn HOUR({fn NOW()})} AS H_Now,
{fn HOUR($HOROLOG)} AS H_Horolog,
{fn HOUR($ZTIMESTAMP)} AS H_ZTS


16 16 16 16 8

请注意,​​$ZTIMESTAMP​​返回协调世界时(UTC)。其他时间表达式值返回本地时间。

下面的示例显示前导零被抑制。

第一个​​HOUR​​函数返回长度为​​2​​,其他函数返回长度为​​1​​。

忽略的时间设为​​0​​小时,其长度为​​1​​:

SELECT LENGTH({fn HOUR('2018-02-15 11:45')}),
LENGTH({fn HOUR('2018-02-15 03:45')}),
LENGTH({fn HOUR('2018-02-15 3:45')}),
LENGTH({fn HOUR('2018-02-15')})

2 1 1 1

下面的嵌入式​​SQL​​​示例显示了HOUR函数识别为区域设置指定的​​timeseseparator​​字符:

ClassMethod Hour()
{
d ##class(%SYS.NLS.Format).SetFormatItem("TimeSeparator",".")
&sql(SELECT {fn HOUR('2018-02-16 18.45.38')} INTO :a)
w "hour=",a
}
DHC-APP>d ##class(PHA.TEST.SQLCommand).Hour()
hour=18