2016-05-18 70 views
4

找不到@previousEndTime变量仅具有YEAR值的原因。如何设置一个MySQL变量的时间戳?

我TEST_TABLE样本数据:

| id | name |      start |      end | 
|----|--------|---------------------------|---------------------------| 
| 2 | test 1 | January, 01 2016 12:00:00 | January, 01 2016 13:00:00 | 
| 3 | test 1 | January, 02 2016 11:00:00 | January, 02 2016 12:00:00 | 
| 5 | test 1 | January, 03 2016 15:00:00 | January, 03 2016 16:00:00 | 
| 6 | test 2 | January, 01 2016 10:00:00 | January, 01 2016 11:00:00 | 
| 7 | test 2 | January, 02 2016 17:00:00 | January, 02 2016 18:00:00 | 



SELECT 
     id, 
     name, 
     @previousEndTime, 
     @previousEndTime := end  
    FROM 
     test_table, (SELECT @previousEndTime := 0) var 
    ORDER BY name, id; 

当前结果:

| id | name | @previousEndTime | @previousEndTime := end | 
|----|--------|------------------|-------------------------| 
| 2 | test 1 |    0 |  2016-01-01 13:00:00 | 
| 3 | test 1 |    2016 |  2016-01-02 12:00:00 | 
| 5 | test 1 |    2016 |  2016-01-03 16:00:00 | 
| 6 | test 2 |    2016 |  2016-01-01 11:00:00 | 
| 7 | test 2 |    2016 |  2016-01-02 18:00:00 | 

预期结果:

| id | name |  @previousEndTime| @previousEndTime := end | 
|----|--------|---------------------|-------------------------| 
| 2 | test 1 |    0 |  2016-01-01 13:00:00 | 
| 3 | test 1 |2016-01-01 13:00:00 |  2016-01-02 12:00:00 | 
| 5 | test 1 |2016-01-02 12:00:00 |  2016-01-03 16:00:00 | 
| 6 | test 2 |2016-01-03 16:00:00 |  2016-01-01 11:00:00 | 
| 7 | test 2 |2016-01-01 11:00:00 |  2016-01-02 18:00:00 | 

请检查该FIDDLE

注:

其他方式,我已经试过:

@previousEndTime := CONCAT('',end,'') 

@previousEndTime := TIMESTAMP(CONCAT('',end,''))  

回答

2

看看这个;)

SQL Fiddle

的MySQL 5.6图式

DROP TABLE IF EXISTS `test_table`; 
CREATE TABLE `test_table` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) CHARACTER SET utf8 NOT NULL, 
    `start` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, 
    `end` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
); 
INSERT INTO `test_table` VALUES ('2', 'test 1', '2016-01-01 12:00:00', '2016-01-01 13:00:00'); 
INSERT INTO `test_table` VALUES ('3', 'test 1', '2016-01-02 11:00:00', '2016-01-02 12:00:00'); 
INSERT INTO `test_table` VALUES ('5', 'test 1', '2016-01-03 15:00:00', '2016-01-03 16:00:00'); 
INSERT INTO `test_table` VALUES ('6', 'test 2', '2016-01-01 10:00:00', '2016-01-01 11:00:00'); 
INSERT INTO `test_table` VALUES ('7', 'test 2', '2016-01-02 17:00:00', '2016-01-02 18:00:00'); 

查询1

SELECT 
    id, 
    name, 
    if(@previousEndTime='0000-00-00 00:00:00',0,@previousEndTime), 
    @previousEndTime := end  
FROM 
    test_table, 
    (
     SELECT 
      @previousEndTime := '0000-00-00 00:00:00' 
    ) var 
ORDER BY name, id 

Results

| id | name | if(@previousEndTime='0000-00-00 00:00:00',0,@previousEndTime) | @previousEndTime := end | 
|----|--------|---------------------------------------------------------------|-------------------------| 
| 2 | test 1 |                0 |  2016-01-01 13:00:00 | 
| 3 | test 1 |           2016-01-01 13:00:00 |  2016-01-02 12:00:00 | 
| 5 | test 1 |           2016-01-02 12:00:00 |  2016-01-03 16:00:00 | 
| 6 | test 2 |           2016-01-03 16:00:00 |  2016-01-01 11:00:00 | 
| 7 | test 2 |           2016-01-01 11:00:00 |  2016-01-02 18:00:00 | 
+0

谢谢里诺。 \t 是这样的:在初始化部分变量的数据类型是确定的? –

+0

是的,我说得对。看一下[User-Defined Variables](http://dev.mysql.com/doc/refman/5.7/en/user-variables.html)。 – Blank

1

试试这个,

SELECT 
     id, 
     name, 
     @previousEndTime, 
     @previousEndTime := end  
    FROM 
     test_table, 
     (
      SELECT 
       @previousEndTime := '0000-00-00 00:00:00' 
     ) var 
    ORDER BY name, id; 

MySQL以YYYY格式显示YEAR值,范围为1901至2155或0000.

作为范围为'0'至'99'的1位或2位数字符串。 MySQL将范围'0'到'69'和'70'到'99'的值转换为2000到2069和1970到1999年的范围内的YEAR值。

插入数字0的结果具有显示值为0000,内部值为0000.要插入零并将其解释为2000,请将其指定为字符串'0'或'00'。

http://dev.mysql.com/doc/refman/5.7/en/year.html

+0

是这样的:在初始化部分变量的数据类型是确定的? –

+0

是的,派生列的数据类型是从第一条记录开始的! – Hytool

+0

非常感谢。自从里诺首先回答我应该接受他的回答。我所能做的就是提高你的答案。谢谢哥们。 –