2014-03-12 86 views
0

我正在写简单的SQL选择,但提出了问题。当我运行以下选择SQL的情况下FROM(UNIX_TIME)

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 

我想知道它可能是与称为FROM_UNIXTIME函数的问题。但另一方面,作为一个独立的功能,它完美地工作。等待结果是显示0(在情况下为0)而不是1970-01-01 01:00:00。 在此先感谢。

+1

你能添加数据和不匹配的结果的样本? –

+0

是的,上面提到的选择的结果是值为30的一行。 –

+0

他打算在这里放一张桌子的小堆,所以我们可以重现这个问题。 – fancyPants

回答

0

FROM_UNIXTIME()返回时间戳记值。从manual:

TIMESTAMP的范围为'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 | 
+---------------------------------------+ 

现在回到 “正确” 的价值观。

UPDATE:

简单快捷的解决方案:

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 
+0

谢谢,那是我无法处理的第一部分。但另一件事让我发疯。我希望只有'0'(没有更多)值而不是全日期('1970-01-01 01:00:00')。 –

+0

@MartinOrem更新了我的答案。 – fancyPants

+0

即使我的选择在模式(sqlfiddle.com/#!2/5814ac/3/0)。但是当我在自己的db上运行这个选择时,它会返回'323031342d30332d31322031343a32383a3034'而不是'2014-03-12 13:28:04',考虑到最后一次插入id = 128. –