在SSMS中如何将DATETIME转换为DATE以实现跨表日期匹配?
跨表Datetime字段按日期等值匹配的解决方法
针对你遇到的一个表Datetime带具体时间、另一个表Datetime为零点的匹配问题,核心是把两个字段都转换为纯日期格式后再做等值判断,下面分几种常见SQL数据库给出具体写法:
SQL Server
用CAST()或CONVERT()函数将Datetime转成Date类型,自动剔除时间部分:
SELECT t1.*, t2.* FROM 你的表1 t1 INNER JOIN 你的表2 t2 ON CAST(t1.带时间的日期字段 AS DATE) = CAST(t2.零点日期字段 AS DATE)
MySQL/MariaDB
直接使用DATE()函数提取日期部分:
SELECT t1.*, t2.* FROM 你的表1 t1 INNER JOIN 你的表2 t2 ON DATE(t1.带时间的日期字段) = DATE(t2.零点日期字段)
Oracle
用TRUNC()函数把Datetime的时间部分截断到零点,或者用CAST()转成Date类型:
SELECT t1.*, t2.* FROM 你的表1 t1 INNER JOIN 你的表2 t2 ON TRUNC(t1.带时间的日期字段) = TRUNC(t2.零点日期字段)
小提示
如果查询的数据集非常大,直接在字段上用函数可能会导致索引失效拖慢速度。如果是长期定期提取的需求,可以考虑给转换后的日期值建立计算列索引,或者在表中新增一个单独的Date类型字段存储日期部分。但如果是临时提取数据,直接用上面的写法就足够。
内容的提问来源于stack exchange,提问作者Troy Redmond
相关产品推荐
相关产品推荐

