jav*_*999 1 sql oracle timestamp date
之间有什么区别TIMESTAMP,DATE和TIMESTAMP 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)
但我不确定使用什么格式来搜索DATE或TIMESTAMP WITH TIMEZONE.
数据类型和它们之间的区别在文档中。简短版本是:
您可能也会发现这篇文章很有趣。
每当您比较存储在数据库中的日期时间值时,您应该使用相同数据类型的值进行比较。您不希望必须转换列中的每个值进行比较,尤其是在对列进行索引的情况下。如果您有 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)