Mysql 从开始时的SQL大小写(UNIX_时间)

Mysql 从开始时的SQL大小写(UNIX_时间),mysql,Mysql,我正在编写简单的sqlselect,但问题出现了。当我运行以下命令时,选择 SELECT CASE WHEN t.escalation_time =0 THEN 987 ELSE 789 END FROM ticket t WHERE t.id =1 一切都很好。但当运行这几行时,输出不匹配,它会给出随机数 SELECT CASE WHEN t.escalation_time = 0 THEN

我正在编写简单的sqlselect,但问题出现了。当我运行以下命令时,选择

SELECT
      CASE
          WHEN t.escalation_time =0 THEN 987
          ELSE 789
      END
FROM ticket t WHERE t.id =1
一切都很好。但当运行这几行时,输出不匹配,它会给出随机数

  SELECT
      CASE
          WHEN t.escalation_time = 0 THEN 0
          ELSE FROM_UNIXTIME( t.escalation_time )
      END
FROM ticket t WHERE t.id =1
我想知道从_UNIXTIME调用的函数可能有问题。但另一方面,作为一个独立的功能,它可以完美地工作。等待结果是在案例0中显示0,而不是1970-01-01:00:00。 提前感谢。

返回时间戳值。从

时间戳的范围为“1970-01-01 00:00:01”UTC到“2038-01-19 03:14:07”UTC

现在令人困惑的是,时区被认为带有时间戳

如果你在时区GMT+1h,这个

select unix_timestamp('1970-01-01 00:00:00');
返回

+---------------------------------------+
| unix_timestamp('1970-01-01 00:00:00') |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
由于考虑了时区,因此

select unix_timestamp('1970-01-01 01:00:00');
仍然返回

+---------------------------------------+
| unix_timestamp('1970-01-01 01:00:00') |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
但是这个

select unix_timestamp('1970-01-01 01:00:01');
+---------------------------------------+
| unix_timestamp('1970-01-01 01:00:01') |
+---------------------------------------+
|                                     1 |
+---------------------------------------+
还有这个

select unix_timestamp('1970-01-01 02:00:00');
+---------------------------------------+
| unix_timestamp('1970-01-01 02:00:00') |
+---------------------------------------+
|                                  3600 |
+---------------------------------------+
现在返回正确的值

更新:

简单快捷的解决方案:

SELECT
      CASE
          WHEN t.escalation_time = 0 THEN 0
          WHEN FROM_UNIXTIME( t.escalation_time ) = '1970-01-01 00:00:00' THEN 0
          ELSE FROM_UNIXTIME( t.escalation_time )
      END
FROM ticket t WHERE t.id =1

你能添加数据样本和不匹配的结果吗?是的,上面提到的select的结果是一行,值为30。他想在这里放一个小的表转储,这样我们就可以重现问题。对不起,我忽略了数据样本的第一件事:。事实上,这是一张相当大的桌子……但我提取了一些东西。这些数据不足以重现问题。只有一行的升级时间为0。您希望我们何时测试您案例中的其他部分?此外,你还应该阅读有关索引策略的内容。每一列上都有一个索引绝对不是一个好办法。同样,在同一列上有多个索引。在此插入更多行:谢谢,这是我无法处理的第一部分。但另一件事让我抓狂。我希望只有“0”而不是完整日期“1970-01-01 01:00:00”。MartinOrem更新了我的答案。即使是我的选择也可以在schema sqlfiddle.com/上使用!2/5814ac/3/0。但当我在自己的数据库上运行此select时,考虑到id=128的最后一次插入,它将返回“323031342D332D31322031343A332383A3034”,而不是“2014-03-12 13:28:04”。?你的小提琴和我的一样。用128我得到了正确的值。让它可以复制,否则我们就没办法了。我加了这一行。我在用你的提琴,所以我想它也把这句话复制给了你。Fiddle工作得很好,我自己的数据库返回不匹配的结果。