为啥将 LIKE 与 TIMESTAMPS 一起使用在 DB2 中不起作用

Posted

技术标签:

【中文标题】为啥将 LIKE 与 TIMESTAMPS 一起使用在 DB2 中不起作用【英文标题】:why using LIKE with TIMESTAMPS do not work in DB2为什么将 LIKE 与 TIMESTAMPS 一起使用在 DB2 中不起作用 【发布时间】:2012-04-18 01:38:48 【问题描述】:

我在DB2 中使用LIKE 结构时遇到问题: 例如:

select * from TEST where TIME LIKE '2012-03-04-%'

仅供参考。 - TIMETIMESTAMP 数据类型。

为什么使用LIKETIMESTAMPS 不起作用?

附加信息:我想从用户在 select 语句中提供的一天中提取数据。

【问题讨论】:

因为时间戳不是字符串?如果您真的想将它们视为字符串,请将它们转换为字符串并指定您想要的格式。但是对于这种类型的查询,不要将时间戳转换为其他东西,直接使用它 - 有大量的函数和结构可以本地处理这种数据类型。别再把它们当成字符串了。 【参考方案1】:

LIKE 用于字符串 (char, varchar) 数据类型。使用WHERE time BETWEEN '2012-03-04' AND '2012-03-04 23:59:59.998'

【讨论】:

您的提案包含来自2012-03-05 的一秒,这是意料之外的 也许“2012-03-04”和“2012-04-04 23:59:59.998”之间的时间会更好? @mortb:不,正确到详细的答案是 beny23 提供的答案。 对于 离散 值,BETWEEN 可以。但是,对于 continuous 值,请使用 >= AND <。这不是 SQL,而是理解数据类型及其行为。 @mortb - 与其说是优雅,不如说是精确。 BETWEEN 将出现边界条件错误,因为它包含后续范围的单个点。即使您使用BETWEEN ValueA AND ValueB-aTinyBit,您仍然需要确保您减去的TinyBit 确实是可能的最小数量。由于 FLOAT 是不可能的,不同的日期/时间数据类型具有不同程度的精度,这都是隐藏误差范围的秘诀。【参考方案2】:

只是扩展@mortb 的答案,我会使用BETWEEN

WHERE time >= '2012-03-04' AND time < '2012-03-05'

使用BETWEEN 的优势或使用castsLIKE 的比较意味着如果time 上有索引,则由于强制转换而无法使用。

【讨论】:

+1 :因为不使用带有连续值的BETWEEN。因为不在函数中隐藏搜索字段。并且不使用字符串操作来处理TIMESTAMP。为什么人们认为一切都是字符串!? 我猜当他们首先在日期周围添加 '' (引号)时开始混淆。在为 access 数据库编写 SQL 时,您可以用 # (#2012-04-04#) 包围日期,而不是作为常规字符串文字。这似乎更加明确。 @mortb - 日期周围没有引号。在您的查询中,您有两个字符串常量。由于不可能使用TIMESTAMP &gt;= STRING,因此需要将一种或其他数据类型隐式强制转换为另一种。根据数据类型的优先顺序,字符串被隐式转换为 TIMESTAMP。就像您自己使用了 CAST() 函数一样。【参考方案3】:

你可以这样使用

where time between
    to_date('2016-06-17 00:00:00', 'yyyy-mm-dd HH24:MI:SS') and
    to_date('2016-06-18 00:00:00', 'yyyy-mm-dd HH24:MI:SS'

【讨论】:

以上是关于为啥将 LIKE 与 TIMESTAMPS 一起使用在 DB2 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Wireshark tcp包里的timestamps为啥会没有????

EF Core 5 - 如何将 EF.Functions.Like 与映射到 JSON 字符串的自定义属性一起使用?

为啥将@Transactional 与@Service 一起使用而不是与@Controller 一起使用

为啥将@Transactional 与@Service 一起使用而不是与@Controller 一起使用

为啥将“viewWithTag”与“dequeueReusableCellWithIdentifier”一起使用?

如何在 Sql Server Compact Edition 中将参数与 LIKE 一起使用