将日期转换为 int4
Posted
技术标签:
【中文标题】将日期转换为 int4【英文标题】:Cast date to int4 【发布时间】:2014-09-10 13:49:26 【问题描述】:我正在使用 NETEZZA,并且我有两个单独的表,我想按日期加入。在第一个表中,日期存储为“date”类型(例如,2014-09-10),而在第二个表中,日期存储为“int4”类型(20140910)。我已尝试按日期加入表格:
select *
from table1 a inner join table2 b
on date(a.start_date) = to_date(b.start_date, 'YYYYMMDD')
这运行但很慢。有人向我建议,如果我可以将 table1 中的日期转换为 int4,然后简单地比较 int4,则比较可能会快得多。但是,我找不到这样做的方法,或者这是否是最好的方法。
【问题讨论】:
如果您以相反的方式进行转换,则不太可能运行得更快。不同类型键的连接通常很慢。 @GordonLinoff:您能否至少给我一个想法,因为我是 SQL 新手,我将如何执行演员阵容。然后,我可以直接用一个小案例来测试时间。我的一位同事向我展示(在少数行上),如果我们将 table1 中的日期子串以删除连字符(使其与 int4 的格式匹配),那么它几乎快一个数量级(秒与分钟)。当然,他不确定这是否适用于更多的行数。 转换强制数据库对底层数据进行全面扫描,而不是使用索引。 仅将其中一个字段转换为与另一个字段匹配的类型。这样您就可以使用至少一个索引。最好用较少的行转换表上的字段。实际类型并不重要。 另外,日期有 no 格式。格式仅在您将它们显式或隐式转换为字符串时出现您的同事实际所做的是(隐式)将日期转换为字符串,去除连字符,(隐式)将其转换为 int,然后将其与其他索引进行比较。同样,只使用了一个索引,但这比您之前的完整扫描要好。 【参考方案1】:这是您的查询:
select *
from table1 a inner join
table2 b
on date(a.start_date) = to_date(b.start_date, 'YYYYMMDD');
一般来说,数据库很难连接不同类型的列或连接函数。原因有两个:该功能使使用索引变得困难(或不可能)。不同类型列的统计不兼容。
但是,如果将所有功能移到一侧,引擎可能会做一些事情。例如:
select *
from table1 a inner join
table2 b
on b.start_date = cast(to_char(a.start_date, 'YYYYMMDD') as int);
这会在一侧完成所有转换。如果您在b.start_date
上有一个索引,那么它可以扫描table1
并在索引中查找相应的值。因此,此版本可能运行得更快,但不如表使用相同类型时运行得好。
【讨论】:
这种思维方式让查询的效率比我的快了一个数量级(用时大约 10 秒,而不是几分钟!)【参考方案2】:尝试使用相同的日期类型可能会起作用
SELECT *
FROM table1 a
INNER JOIN table2 b
ON (to_date(a.start_date,'YYYY-MM-DD') = to_date (b.start_date, 'YYYY-MM-DD'))
【讨论】:
也许我不明白,但我不明白这将如何使事情变得更快,因为您仍在像我原来的查询一样比较日期。据我所知,它的运行速度与我的查询一样慢。以上是关于将日期转换为 int4的主要内容,如果未能解决你的问题,请参考以下文章