程序员熬夜写代码为什么效率低?看我因为一个简单的问题挠破头!硬是花了我快一个小时,最后突然反应过来,想死的心都有了!后来我安慰自己:这不能怪我,因为熬夜写代码真的容易走神!

事情很简单,我需要做一个Excel导出数据的功能,根据时间先把数据查询出来,然后写入Excel中进行保存,功能很简单吧?

这就涉及到了Sql语句了,现在有两张表,本来这两张表的数据是独立的,但是,做Excel导出时,需要将这两张表中的部分数据进行合并,所以,就涉及到了联查功能。

最开始,我以为问题很简单,因为两张表中都有字段“xxxNo”和“xxxId”,而在系统的业务逻辑中,这两个字段合并起来应该是全局唯一的,但是,偶尔会出现不是唯一的情况,因此,这两个字段并没有被设计成唯一索引。

我希望Sql语句达到的效果应该是A表为主表,B表为从表,A表Left Join B表,想要达到的目的就是,A表不管有多少数据先查出来,然后再根据A表已有的数据去联查B表。

但是,我查询出来的数据条数始终不对,假设A表的数据量有100条,我希望不管B表有多少数据,联表查询后的数据总条数就应该是100条,但是,我查出来的数据始终是大于100条。

因为“xxxNo”和“xxxId”这两个字段在B表内并非唯一,所以查询就有问题了。

然后,我对B表进行了重新改造,直接在B表中新增了一个字段“AId”,即A表数据行的Id。

按照我的认知,这样一来,不管怎么样,这个“AId”在B表内肯定是唯一的,因为只有A表在新增数据时,B表会跟着新增数据,并且因为A表的Id是自增的,怎么搞也不会重复吧!

然后,诡异的事情就出现了,我将代码改好以后,新增了一条数据,选择了数据导出,结果只出现了一条数据!可是,A表明明有101条数据啊,怎么在B表中新增字段以后查出来的数据只有1条了呢?

我开始怀疑起了我对数据库的认知,难道Left Join B表后,按照A表的Id进行匹配,只会联合查询出A表Id和B表“AId”匹配的数据?

为了验证我的想法,我又新增了一条数据,A表数据来到了102行,然后我再点击数据导出,结果数据真的只有2行!

此时,我有点崩溃了!难道我一直以来对数据库查询的认知有问题?

你们绝对想不到我犯了什么样的错误!并且,你们也绝对想不到我是怎么发现这个错误的!其实,错误非常简单!

因为,在“错误”出现的时候,已经过了凌晨0点!

我一直以来都是根据时间查询的,即当天的0点到当天的23点59分59秒这个时间段查询的数据,根据这个条件,查询出来的数据是100行!

并且,我的软件第一次进入查询界面,代码就会自动将时间控件置为当天的0点到当天的23点59分59秒。

因为每次改完代码,我都需要重启软件,因此,时间控件的值就会被自动重置,在我改完代码后,时间就被重置了。

所以,我即使新增了一条字段,A表此时能查询出来的数据条数也就只有一条!

而我是怎么发现这个问题的呢?

因为我改完代码以后,数据条数始终不对,我就进了数据库去查询数据来验证我的Sql语句到底有没有写错,但是,在我的意识里,是还没过0点的,所以,我的查询条件依然写得是前一天的0点到23点59分59秒这个时间段。

结果,查出来的数据依然是100条!

刚开始我还纳闷,此时数据明明是102条啊,怎么查询出来的数据只有100条呢?

直到现在,我都没有怀疑时间是否已经过了0点这件事情!直到我挠破头都想不到我错在哪里的时候,我下意识地拿起手机想要放松一会儿,结果发现我的手机是黑屏的!

此时我恍然大悟,因为我的手机过了凌晨0点会自动熄屏的!

结语

得知真相的我,真的被自己蠢哭了,直到我解决问题的时候,都已经快凌晨1点了!我竟然在这个问题上折腾了那么久!

不过,这也提醒我,此时应该关闭电脑,好好休息了!否则,下一步又不知道犯什么蠢事了!

很多程序员都说加班或者熬夜写代码效率低,可能非程序员没有什么概念,经过我的事情,你们现在应该知道为什么加班或者熬夜写代码效率低了吧?因为当连续工作时间太长的话,脑子是真不好使了!