为啥将 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-%'
仅供参考。 - TIME
是 TIMESTAMP
数据类型。
为什么使用LIKE
和TIMESTAMPS
不起作用?
附加信息:我想从用户在 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
的优势或使用casts
和LIKE
的比较意味着如果time
上有索引,则由于强制转换而无法使用。
【讨论】:
+1 :因为不使用带有连续值的BETWEEN
。因为不在函数中隐藏搜索字段。并且不使用字符串操作来处理TIMESTAMP
。为什么人们认为一切都是字符串!?
我猜当他们首先在日期周围添加 '' (引号)时开始混淆。在为 access 数据库编写 SQL 时,您可以用 # (#2012-04-04#) 包围日期,而不是作为常规字符串文字。这似乎更加明确。
@mortb - 日期周围没有引号。在您的查询中,您有两个字符串常量。由于不可能使用TIMESTAMP >= 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 一起使用