在线文档教程

Date And Time Functions

SQL As Understood By SQLite

[Top]

日期和时间函数

SQLite支持五个日期和时间函数,如下所示:

  • date(timestring, modifier, modifier, ...)

  • time(timestring, modifier, modifier, ...)

  • datetime(timestring, modifier, modifier, ...)

  • julianday(timestring, modifier, modifier, ...)

  • strftime(format, timestring, modifier, modifier, ...)

所有五个日期和时间函数都以时间字符串作为参数。时间字符串后跟零个或多个修饰符。strftime()函数还将格式字符串作为其第一个参数。

日期和时间函数使用 IS0-8601 日期和时间格式的一个子集。date()函数以这种格式返回日期:YYYY-MM-DD。time()函数将时间返回为 HH:MM:SS。datetime()函数返回“YYYY-MM-DD HH:MM:SS”。julianday()函数返回 Julian日 - 自公元前4714年11月24日(普莱恩格里历)格林威治中午以来的天数。strftime()例程返回根据指定为第一个参数的格式字符串格式化的日期。格式字符串支持来自标准 C 库的 strftime() 函数中最常见的替换以及两个新替换 %f和 %J。以下是有效 strftime()替换的完整列表:

%d-日月份:00

请注意,所有其他日期和时间函数都可以用 strftime()表示:

Function Equivalent strftime() date(...) strftime('%Y-%m-%d', ...) time(...) strftime('%H:%M:%S', ...) datetime(...) strftime('%Y-%m-%d %H:%M:%S', ...) julianday(...) strftime('%J', ...)

提供除 strftime()以外的功能的唯一原因是为了方便和提高效率。

Time Strings

时间字符串可以是以下任何一种格式:

  • YYYY-MM-DD

  • YYYY-MM-DD HH:MM

  • YYYY-MM-DD HH:MM:SS

  • YYYY-MM-DD HH:MM:SS.SSS

  • YYYY-MM-DDTHH:MM

  • YYYY-MM-DDTHH:MM:SS

  • YYYY-MM-DDTHH:MM:SS.SSS

  • HH:MM

  • HH:MM:SS

  • HH:MM:SS.SSS

  • now

  • DDDDDDDDDD

格式5至7中,“T” 是一个字面字符,用于分隔日期和时间,如 ISO-8601 所要求的。格式8至10仅指定时间假定日期为 2000-01-01。格式11,字符串 'now',被转换为从当前使用的 sqlite3_vfs 对象的 xCurrentTime 方法获得的当前日期和时间。对于日期和时间函数的 'now' 参数始终会在同一个 sqlite3_step()调用中为多个调用返回完全相同的值。使用全球协调时间(UTC)。格式12是以浮点值表示的 Julian 日数

格式2至10可以选择后跟一个格式为 “ + -HH:MM ” 或只是 “ Z ” 的时区指示符。日期和时间函数在内部使用 UTC 或 “zulu” 时间,所以 “Z” 后缀是无操作的。从指定的日期和时间中减去任何非零 “HH:MM” 后缀以计算祖鲁时间。例如,以下所有时间字符串都是等效的:

2013-10-07 08:23:19.120 2013-10-07T08:23:19.120Z 2013-10-07 04:23:19.120-04:00 2456572.84952685

在格式4,7和10中,小数秒值 SS.SSS 可以在小数点后面有一个或多个数字。实例中只显示了三位数字,因为只有前三位数字对结果有意义,但输入字符串可以少于或多于三位数字,并且日期/时间函数仍可正常运行。类似地,格式12以10位有效数字显示,但日期/时间功能将真正接受表示朱利安日数的必要位数或位数。

修饰符

时间字符串后面可以跟零个或多个修改日期和/或时间的修改器。每个修饰符都是应用于其左侧的时间值的转换。修饰符从左到右应用; 顺序很重要。可用的修饰符如下。

  • NNN days

  • NNN hours

  • NNN minutes

  • NNN.NNNN seconds

  • NNN months

  • NNN years

  • start of month

  • start of year

  • start of day

  • weekday N

  • unixepoch

  • localtime

  • utc

前六个修饰符(1到6)只是将指定的时间量添加到由前面的时间字符串和修饰符指定的日期和时间。修饰符名称末尾的 's' 字符是可选的。请注意,“±NNN month”的工作原理是将原始日期转换为 YYYY-MM-DD 格式,将 ±NNN 添加到 MM 月份值,然后对结果进行归一化。因此,例如,由'+1月'修改的数据2001-03-31最初产生2001-04-31,但是4月仅有30天,因此日期标准化为2001-05-01。当原始日期是闰年的2月29日并且修饰符是±N 年(其中 N 不是4的倍数)时,会出现类似的效果。

“开始”修饰符(7到9)将日期向后移动到当前月份,年份或日期的开始。

“工作日”修饰符将日期推进到工作日号为 N 的下一个日期。星期日为0,星期一为1,依此类推。

如果紧跟 DDDDDDDDDD 格式的时间字符串,“unixepoch” 修饰符(11)才起作用。该修饰符使得 DDDDDDDDD 不像通常那样被解释为 Julian 天数,而是作为 Unix 时间 - 自1970年以来的秒数。如果 “unixepoch” 修饰符不遵循表示 DDDDDDDDDD 的时间串,其表达自1970年以来的秒数,或者如果其他修饰符将 “unixepoch” 修饰符与先前的 DDDDDDDDDD 分开,则行为未定义。对于3.16.0(2017-01-02)之前的 SQLite 版本,“unixepoch” 修饰符仅适用于0000-01-01 00:00:00和5352-11-01 10:52:47之间的日期(unix times -62167219200至106751991167)。

“localtime” 修饰符(12)假定其左侧的时间字符串处于通用协调时间(UTC),并调整时间字符串以显示本地时间。如果“localtime”跟随的时间不是 UTC,那么行为是未定义的。“utc” 修饰符与 “localtime” 相反。“utc” 假定其左侧的字符串位于本地时区,并将该字符串调整为 UTC。如果之前的字符串不在本地时间,那么 “utc” 的结果是未定义的。

例子

计算当前日期。

SELECT date('now'

计算当前月份的最后一天。

SELECT date('now','start of month','+1 month','-1 day'

计算给定 unix 时间戳1092941466的日期和时间。

SELECT datetime(1092941466, 'unixepoch'

计算给定 unix 时间戳1092941466的日期和时间,并补偿您当地的时区。

SELECT datetime(1092941466, 'unixepoch', 'localtime'

计算当前的 unix 时间戳。

SELECT strftime('%s','now'

计算自美国独立宣言签署以来的天数。

SELECT julianday('now') - julianday('1776-07-04'

计算自2004年特定时刻以来的秒数:

SELECT strftime('%s','now') - strftime('%s','2004-01-01 02:34:56'

计算当年10月份的第一个星期二的日期。

SELECT date('now','start of year','+9 months','weekday 2'

计算自 unix 时期以来的时间(如 strftime('%s','now'),除了小数部分):

SELECT (julianday('now') - 2440587.5)*86400.0;

警告和错误

当地时间的计算在很大程度上取决于政客的心血来潮,因此难以在所有地区得到正确的答案。在这个实现中,标准C库函数localtime_r()用于协助计算本地时间。localtime_r()函数通常只能在1970年到2037年之间工作。对于超出此范围的日期,SQLite 会尝试将年份映射到此范围内的同年份,然后执行计算,然后将年份映射回年份。

这些功能仅适用于0000-01-01 00:00:00和9999-12-31 23:59:59之间的日期(朱利丹日号码1721059.5到5373484.5)。对于那个范围以外的日期,这些函数的结果是不确定的。

Non-Vista Windows 平台仅支持一套 DST 规则。Vista 只支持两种。因此,在这些平台上,历史DST计算将不正确。例如,在美国,2007年 DST 规则发生了变化。Non-Vista Windows 平台也将新的2007年 DST 规则应用于所有前几年。Vista 的结果可以更好地回溯到1986年,当时规则也发生了变化。

所有内部计算均假定公历系统。还假定每天的持续时间正好是86400秒。