簡體   English   中英

如何在 MySQL 中以 30 分鍾為間隔獲取 SELECT 數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM