我有一个包含设备数据的表格,其中一列created_ts
- > varchar(30)
问题:此列中的此数据包含linux时间戳和varchars,例如:
1381148885
和
2012-09-17 22:13:17
如何使用created_ts>查询此列中的所有记录? 2013年10月1日
答案 0 :(得分:3)
我选择通过检查短划线字符来区分字符串格式('YYYY-MM-DD'或unix时间戳整数)。
我会考虑使用适当的转换将这两种格式显式转换为DATE
数据类型。我将得到的DATE值与日期文字进行比较。
这样的事情:
WHERE IF(LOCATE('-',t.created_ts,5), -- which format (yyyy-mm-dd or integer)
STR_TO_DATE(t.created_ts,'%Y-%m-%d %T'), -- convert yyyy-mm-dd string to date
FROM_UNIXTIME(t.created_ts) -- convert string as integer to date
) >= '2013-10-01' -- compare to date literal
另一种选择是将字符串列和日期文字转换为整数值,并进行整数比较。 (同样,字符串列有两种不同的转换,具体取决于格式。)
注意:我在%T的转换中加入了hh:mm:ss部分。
当没有提供时间组件时,时间组件被假定为午夜(零)00:00:00,并根据我们是否要考虑而发挥作用
'2013-10-01 07:34:55' > '2013-10-01 00:00:00'
OP查询具有大于比较。我使用了大于或等于比较。
这可以根据要求进行调整。我们想知道,如果我们不小心,一些值将“向下舍入”到前一个午夜,然后当我们做一个大于比较时,我们真正得到的是等同于>= '2013-10-02'
我的偏好是让它更明确。它使读者更容易理解查询实际在做什么。
<强>更新强>
我在LOCATE函数中向后反转了...要搜索的字符串应该是第一个参数,要搜索的字符串是第二个。这已在上面的查询中得到纠正。
答案 1 :(得分:0)
这样的事情:
select * from yourTable
where created_ts > '2013-10-01'
or from_unixtime(created_ts) > '2013-10-01';