SQL- TIMESTAMP、DATE 和 TIMESTAMP WITH TIMEZONE 之间的区别?

jav*_*999 1 sql oracle timestamp date

之间有什么区别TIMESTAMPDATETIMESTAMP with TIMEZONE

例如,如果我想搜索01-JAN-1990和 之间的所有条目01-JAN-2000 ,我将如何以每种格式进行搜索?

我一直在寻找时间戳:

SELECT COUNT(*) FROM TABLE_NAME WHERE DATE BETWEEN '01-JAN-1990' AND '01-JAN-2000;
Run Code Online (Sandbox Code Playgroud)

但我不确定使用什么格式来搜索DATETIMESTAMP WITH TIMEZONE.

Ale*_*ole 6

数据类型和它们之间的区别在文档中。简短版本是:

  • DATE 精度低至一秒,不支持时区;
  • TIMESTAMP 的精度低至几分之一秒(最多九位小数,但您的操作系统也会影响它),仍然不支持时区;
  • TIMESTAMP WITH TIME ZONE 与 TIMESTAMP 具有相同的精度,但也有时区支持,顾名思义;
  • TIMESTAMP WITH LOCAL TIME ZONE 在创建/查询会话的本地时区之间调整存储值。

您可能也会发现这篇文章很有趣。

每当您比较存储在数据库中的日期时间值时,您应该使用相同数据类型的值进行比较。您不希望必须转换列中的每个值进行比较,尤其是在对列进行索引的情况下。如果您有 DATE 列,则与 DATE 进行比较 - 不要作为字符串进行比较,也不要依赖于字符串的隐式转换。当你这样做时:

WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'
Run Code Online (Sandbox Code Playgroud)

你依赖你的 NLS_DATE_FORMAT 是 DD-MON-YYYY 而你的 NLS_DATE_LANGUAGE 是英语。如果其他人在另一个会话中运行相同的查询,他们的设置可能会导致查询失败(或者在某些情况下,给出错误的结果,这可能会更糟)。为了避免语言问题,最好使用月份数字而不是名称。如果您有要比较的字符串变量,您应该使用TO_DATE()固定的已知格式掩码将字符串转换为 DATE - 不要依赖 NLS。如果您有一个固定值,您可以这样做,或者您可以使用更短且明确的日期文字

使用您使用的格式,您还包括将列设置为 2000 年 1 月 1 日午夜的任何行,但不会在当天晚些时候。这可能是您想要的,但请确保您了解BETWEEN工作原理。如果您实际上要查找该十年内的日期,包括 1999 年 12 月 31 日的任何时间,您可以使用:

WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'
Run Code Online (Sandbox Code Playgroud)

对于时间戳,您可以使用TO_TIMESTAMP()或使用时间戳文字:

WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'
Run Code Online (Sandbox Code Playgroud)

对于带有时区的时间戳,您可以使用TO_TIMESTAMP_TZ()或使用时间戳文字,并带有名称时区区域:

WHERE tstz_col >= TIMESTAMP '1990-01-01 00:00:00 America/New_York'
AND tstz_col < TIMESTAMP '2000-01-01 00:00:00 America/New_York'
Run Code Online (Sandbox Code Playgroud)