MySQL varchar timestamp列存储了两种不同的方式

时间:2014-03-07 19:07:12

标签: mysql sql date select timestamp

我有一个包含设备数据的表格,其中一列created_ts - > varchar(30)

问题:此列中的此数据包含linux时间戳和varchars,例如:

1381148885

2012-09-17 22:13:17

如何使用created_ts>查询此列中的所有记录? 2013年10月1日

2 个答案:

答案 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';