问题描述
|
我有一个以奇怪的方式工作的mySQL查询。我将发布2个查询,其中输入数据已更改,并且输出在每个查询下列出。
查询1(应注意的区域“ 0”):
总共选择COUNT(pos_transaction_id)个AS,
DATE_FORMAT(pt.timestamp,\'%d-%m-%Y%H:%i:%S \')AS日期,
SUM(金额)AS金额
来自pos_transactions pt
DATE_FORMAT(pt.timestamp,\'%e /%m /%y \')在\ '13 / 05/11 \'和\ '30 / 05/11 \'之间
按周分组(按时间戳记)按按时间戳记排序
输出:
查询2(应注意的区域“ѭ1”):
总共选择COUNT(pos_transaction_id)个AS,
DATE_FORMAT(pt.timestamp,\'%d-%m-%Y%H:%i:%S \')AS日期,
SUM(金额)AS金额
来自pos_transactions pt
DATE_FORMAT(pt.timestamp,\'%e /%m /%y \')在\'3/05/11 \'AND \ '30 / 05/11 \'之间
按周分组(按时间戳记)按按时间戳记排序
输出:
现在,当第二个查询的范围增加时,为什么我只得到一个记录?即使在第一个查询中,我也得到超出范围的记录。有什么问题吗?
编辑
更改后的查询看起来像这样,仍然没有按照我想要的去做。
总共选择COUNT(pos_transaction_id)个AS,
DATE_FORMAT(pt.timestamp,\'%d-%m-%Y%H:%i:%S \')AS日期,
SUM(金额)AS金额
来自pos_transactions pt
DATE_FORMAT(pt.timestamp,\'%e /%m /%y \')在STR_TO_DATE(\'01/05/11 \',\'%e /%m /%y \')和STR_TO_DATE(\ '30 / 05/11 \',\'%e /%m /%y \')
按周分组(按时间戳记)按按时间戳记排序
输出为:
解决方法
我认为您正在看到两种不良做法交织在一起的结果。
首先,date_format()函数返回一个字符串。您的WHERE子句进行字符串比较。在PostgreSQL中
select \'26/04/2011\' between \'13/05/11\' AND \'30/05/11\';
--
T
那是因为字符串\ '26 \'在字符串\ '13 \'和\ '30 \'之间。但是,如果将它们写为日期,PostgreSQL会正确地告诉您\'2011-04-26 \'(遵循服务器上的datestyle设置)不在该范围内。
其次,我猜测出现奇数超出范围的值是因为您在聚合中使用了不确定的表达式。表达式“3ѭ”未出现在SELECT列表中。我认为,如果您尝试这样做,市场上的所有其他SQL引擎都将引发错误。由于它不在SELECT列表中,因此MySQL将从该聚合范围返回一个显然随机的值。
为避免此类错误,请不要在日期或时间戳范围内进行字符串比较,也不要使用不确定的聚合表达式。
发布DDL和最少的SQL INSERT语句来重现该问题将帮助人们。
, 我绝对不确定,但是也许比较是按4英镑而不是日期进行的。
DATE_FORMAT
返回string
,并且您的两个条件也是字符串。
您应该尝试不使用“ 5”,而不要仅使用列,或者尝试将条件转换为日期。
我在想这样的事情:
pt.timestamp BETWEEN STR_TO_DATE(\'13/05/11\',\'%e/%m/%y\') AND STR_TO_DATE(\'30/05/11\',\'%e/%m/%y\')
, 我很确定你有意做
WHERE pt.timestamp BETWEEN TO_DATE(\'13/04/11\',\'dd/mm/yy\') AND TO_DATE(\'30/05/11\',\'dd/mm/yy\')
在要求它在其他两个字符串之间输入一个字符串之前。
更新资料
我认为这里缺少几点。根据您对ѭ10进行的计算,我将假设它是ѭ11的类型。在查询中,如果要进行范围比较,则需要直接使用时间戳。时间戳已包含进行此比较所需的所有数据。您无需将其隐藏到天/月/年即可进行比较。
您需要做的是:
查找我的timestamp
在create a new date from \'13/05/11\'
和create a new date from \'30/05/11\'
之间的所有值。 pt.timestamp
已经是一个时间戳,无需在WHERE子句中进行转换。
您要做的就是将其转换为String表示形式。当您要显示它时可以,但是当您要将其与其他值进行比较时可以。