My guess with no code inspection is that substr returns a string where s date 
literal string is a date literal (parser handles this).  As such the string 
conversion to date probably produces a time with microsecond resolution, so you 
see 0 microseconds.  This is likely because concat returns the data type of the 
first argument, which is a date literal, but substr returns string, which must 
be cast internally.

--Justin

Sent from my iPhone

> On Sep 19, 2015, at 3:53 PM, Dan Ragle <[email protected]> wrote:
> 
> We're converting from MySQL 5.1 to MariaDB 5.5.44 and I'm hoping someone can 
> help clarify for me what's going on in the following scenario. In brief, 
> we're getting milliseconds displayed in a particular date_sub calculation 
> (and possibly other selects with date arithmetic, trying to figure out how to 
> track them down is part of the goal of this post) where we aren't expecting 
> them.
> 
> MariaDB [testdb]> show variables like '%version%';
> +-------------------------+---------------------+
> | Variable_name           | Value               |
> +-------------------------+---------------------+
> | innodb_version          | 5.5.43-MariaDB-37.2 |
> | protocol_version        | 10                  |
> | slave_type_conversions  |                     |
> | version                 | 5.5.44-MariaDB-log  |
> | version_comment         | MariaDB Server      |
> | version_compile_machine | x86_64              |
> | version_compile_os      | Linux               |
> +-------------------------+---------------------+
> 7 rows in set (0.00 sec)
> 
> MariaDB [testdb]> show create table test \G
> *************************** 1. row ***************************
>       Table: test
> Create Table: CREATE TABLE `test` (
>  `datetime` datetime NOT NULL
> ) ENGINE=MyISAM DEFAULT CHARSET=latin1
> 1 row in set (0.00 sec)
> 
> MariaDB [testdb]> select datetime from test;
> Field   1:  `datetime`
> Catalog:    `def`
> Database:   `velocitynorep`
> Table:      `test`
> Org_table:  `test`
> Type:       DATETIME
> Collation:  binary (63)
> Length:     19
> Max_length: 19
> Decimals:   0
> Flags:      NOT_NULL BINARY NO_DEFAULT_VALUE
> 
> +---------------------+
> | datetime            |
> +---------------------+
> | 2015-09-18 09:23:21 |
> +---------------------+
> 1 row in set (0.00 sec)
> 
> MariaDB [testdb]> select date_sub(datetime,interval 1 second) from test;
> Field   1:  `date_sub(datetime,interval 1 second)`
> Catalog:    `def`
> Database:   ``
> Table:      ``
> Org_table:  ``
> Type:       DATETIME
> Collation:  binary (63)
> Length:     19
> Max_length: 19
> Decimals:   0
> Flags:      BINARY
> 
> 
> +--------------------------------------+
> | date_sub(datetime,interval 1 second) |
> +--------------------------------------+
> | 2015-09-18 09:23:20                  |
> +--------------------------------------+
> 1 row in set (0.00 sec)
> 
> MariaDB [testdb]> select substr(datetime,1,13) from test;
> Field   1:  `substr(datetime,1,13)`
> Catalog:    `def`
> Database:   ``
> Table:      ``
> Org_table:  ``
> Type:       VAR_STRING
> Collation:  utf8_general_ci (33)
> Length:     39
> Max_length: 13
> Decimals:   31
> Flags:      NOT_NULL
> 
> +-----------------------+
> | substr(datetime,1,13) |
> +-----------------------+
> | 2015-09-18 09         |
> +-----------------------+
> 1 row in set (0.00 sec)
> 
> MariaDB [testdb]> select concat(substr(datetime,1,13),':00:00')
>    -> from test;
> Field   1:  `concat(substr(datetime,1,13),':00:00')`
> Catalog:    `def`
> Database:   ``
> Table:      ``
> Org_table:  ``
> Type:       VAR_STRING
> Collation:  utf8_general_ci (33)
> Length:     57
> Max_length: 19
> Decimals:   31
> Flags:      NOT_NULL
> 
> +----------------------------------------+
> | concat(substr(datetime,1,13),':00:00') |
> +----------------------------------------+
> | 2015-09-18 09:00:00                    |
> +----------------------------------------+
> 1 row in set (0.00 sec)
> 
> MariaDB [testdb]> select concat('2015-09-18 09',':00:00');
> Field   1:  `concat('2015-09-18 09',':00:00')`
> Catalog:    `def`
> Database:   ``
> Table:      ``
> Org_table:  ``
> Type:       VAR_STRING
> Collation:  utf8_general_ci (33)
> Length:     57
> Max_length: 19
> Decimals:   31
> Flags:      NOT_NULL
> 
> 
> +----------------------------------+
> | concat('2015-09-18 09',':00:00') |
> +----------------------------------+
> | 2015-09-18 09:00:00              |
> +----------------------------------+
> 1 row in set (0.00 sec)
> 
> MariaDB [testdb]> select date_sub(concat('2015-09-18 09',':00:00'),
>    -> interval 1 second);
> Field   1:  `date_sub(concat('2015-09-18 09',':00:00'),
> interval 1 second)`
> Catalog:    `def`
> Database:   ``
> Table:      ``
> Org_table:  ``
> Type:       STRING
> Collation:  binary (63)
> Length:     19
> Max_length: 19
> Decimals:   0
> Flags:      BINARY
> 
> 
> +---------------------------------------------------------------+
> | date_sub(concat('2015-09-18 09',':00:00'),
> interval 1 second) |
> +---------------------------------------------------------------+
> | 2015-09-18 08:59:59                                           |
> +---------------------------------------------------------------+
> 1 row in set (0.00 sec)
> 
> MariaDB [testdb]> select
>    -> date_sub(concat(substr(datetime,1,13),':00:00'),
>    -> interval 1 second) from test;
> Field   1:  `date_sub(concat(substr(datetime,1,13),':00:00'),
> interval 1 second)`
> Catalog:    `def`
> Database:   ``
> Table:      ``
> Org_table:  ``
> Type:       STRING
> Collation:  binary (63)
> Length:     26
> Max_length: 26
> Decimals:   6
> Flags:      BINARY
> 
> +---------------------------------------------------------------------+
> | date_sub(concat(substr(datetime,1,13),':00:00'),
> interval 1 second) |
> +---------------------------------------------------------------------+
> | 2015-09-18 08:59:59.000000                                          |
> +---------------------------------------------------------------------+
> 1 row in set (0.00 sec)
> 
> The last one is the one that has me stumped.
> 
> 1.) Why does it include milliseconds in the output? According to this page:
> 
>    https://mariadb.com/kb/en/mariadb/microseconds-in-mariadb/
> 
> where no precision is specified the result should not display milliseconds, 
> which is what happens in all the other examples above except this one.
> 
> 2.) The statement on a 5.1 MySQL server (5.1.73-log, also 64 bit Linux) 
> produces this:
> 
> mysql> select date_sub(concat(substr(datetime,1,13),':00:00'),
>    -> interval 1 second) from test;
> Field   1:  `date_sub(concat(substr(datetime,1,13),':00:00'),
> interval 1 second)`
> Catalog:    `def`
> Database:   ``
> Table:      ``
> Org_table:  ``
> Type:       STRING
> Collation:  binary (63)
> Length:     29
> Max_length: 19
> Decimals:   31
> Flags:      BINARY
> 
> +---------------------------------------------------------------------+
> | date_sub(concat(substr(datetime,1,13),':00:00'),
> interval 1 second) |
> +---------------------------------------------------------------------+
> | 2015-09-18 08:59:59                                                 |
> +---------------------------------------------------------------------+
> 1 row in set (0.00 sec)
> 
> Is there some global variable I can set to revert to the 5.1 behavior? I 
> realize I can CAST the result to a datetime to make sure I don't get the 
> fractional seconds, but as I mentioned we're converting our system over to 
> 5.5 and there's boatloads of code that I would have to scan through to try 
> and find these differences.
> 
> 3.) If there is no way to revert to the 5.1 behavior, can someone help me to 
> understand the exact reason why the milliseconds get displayed on the final 
> select in MariaDB 5.5? I'll need to look for any similar types of results and 
> other than the exact reduction above I'm not sure what statements I would 
> need to identify and test.
> 
> Thanks for any assistance!
> 
> Dan Ragle
> 
> _______________________________________________
> Mailing list: https://launchpad.net/~maria-discuss
> Post to     : [email protected]
> Unsubscribe : https://launchpad.net/~maria-discuss
> More help   : https://help.launchpad.net/ListHelp

_______________________________________________
Mailing list: https://launchpad.net/~maria-discuss
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~maria-discuss
More help   : https://help.launchpad.net/ListHelp

Reply via email to