[英]How to SELECT data by interval of 30 minutes in MySQL?
我正在嘗試每隔 30 分鍾對 MySQL 表中的 select 數據進行求和,其中所有值相加,數據是付款類型和每次付款總額,問題是一旦我得到數據,我有時會獲得兩次相同的數據時間范圍如:
因為這兩個時間都是 8:30:00,所以應該相加但不是..
我的查詢如下所示:
SELECT SUM(IF(TIPODOC_PA = 'SCONTRINO' OR TIPODOC_PA = 'FATTURA', (IMPORTOPAG_PA - RESTO_PA), 0)) AS TOTPAG, DESCRPAG_PA, RISCPAG_PA, FROM_UNIXTIME(ROUND(UNIX_TIMESTAMP(TIMESTAMP(DATA_PA, ORA_PA))/(30* 60)) * (30*60)) AS DATA FROM pagamenti WHERE TIPODOC_PA <> 'VE' AND DESCRPAG_PA <> 'PR' AND DESCRPAG_PA <> 'NR' AND DESCRPAG_PA <> 'FC' AND DATA_PA BETWEEN '2022-02-04' AND '2022-02-04' AND (NPV_PA, NCASSA_PA) IN ((0, 1)) GROUP BY DESCRPAG_PA, ( 4 * HOUR(TIMESTAMP(DATA_PA, ORA_PA)) + FLOOR( MINUTE(TIMESTAMP(DATA_PA, ORA_PA)) / 30 )) ORDER BY TIMESTAMP(DATA_PA, ORA_PA)
和創建模式:
DROP TABLE IF EXISTS `pagamenti`;
CREATE TABLE `pagamenti` (
`NPV_PA` int(11) NOT NULL default '0',
`NCASSA_PA` int(11) NOT NULL default '0',
`TIPODOC_PA` varchar(250) NOT NULL default '',
`TIPOPAG_PA` varchar(250) NOT NULL default '',
`DESCRPAG_PA` varchar(250) NOT NULL default '',
`RISCPAG_PA` int(1) default '0',
`DATA_PA` date NOT NULL default '2001-01-01',
`ORA_PA` time default '00:00:00',
`AZZ_PA` varchar(10) NOT NULL default '0000',
`NSC_PA` int(11) NOT NULL default '0',
`ID_PA` int(30) NOT NULL default '0',
`IMPORTODOC_PA` float(10,3) default '0.000',
`IMPORTOPAG_PA` float(10,3) default '0.000',
`RESTO_PA` float(10,3) default '0.000',
`OPERATORE_PA` int(10) default '0',
`CODICEBUONO_PA` varchar(250) default '',
`IDTICKET_PA` int(11) default '0',
`TIPOOPER_PA` varchar(250) default '',
PRIMARY KEY USING BTREE (`NPV_PA`,`NCASSA_PA`,`TIPODOC_PA`,`DATA_PA`,`AZZ_PA`,`NSC_PA`,`ID_PA`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
GROUP BY
在這個表達式上:
( 4 * HOUR(TIMESTAMP(DATA_PA, ORA_PA)) + FLOOR( MINUTE(TIMESTAMP(DATA_PA, ORA_PA)) / 30 ))
但該表達式未在 SELECT 列表中返回。 我們在 SELECT 列表中看到的是不同的表達方式。
FROM_UNIXTIME(ROUND(UNIX_TIMESTAMP(TIMESTAMP(DATA_PA, ORA_PA))/(30* 60)) * (30*60))
我們不能保證這兩個表達式將返回相同的值。
我懷疑如果我們練習這些表達式,我們會發現它們並不總是返回相同的值。 (一個明顯的提示是其中一個表達式使用FLOOR
而另一個使用ROUND
。考慮:
SELECT FLOOR(1.6) AS _one , ROUND(1.6) AS _two
通常我們在SELECT
列表中的GROUP BY
中包含表達式,因此我們可以看到返回的這些值。 如果我們這樣做,將該表達式作為列添加到 SELECT 列表中,我們將觀察到差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.