简体   繁体   English

SQL查询以获取选择语句中日期之间的差异

[英]SQL query to get dif between dates in select statment

I have a two tables call RFS and RFS_History. 我有两个表叫做RFS和RFS_History。

 RFS_id  | name 
 --------+--------
    12   |  xx
    14   |  yy
    15   |  zz

figure 1 :RFS table 图1:RFS表

     RFS_id  |  gate | End    | start 
     --------+-------+--------+-------
        12   |  aa   | 19/02  | 20/03
        12   |  bb   | 30/01  | 12/08
        12   |  cc   | 30/01  | 12/08
        13   |  aa   | 30/01  | 12/08
        12   |  dd   | 30/01  | 12/08

figure 2 :RFS history 图2:RFS历史

My initial query is a select * query to get information where FRSname ='xx' 我的初始查询是select *查询,以获取FRSname ='xx'的信息

SELECT * FROM RFS, RFSHistory 
WHERE RFSname="xx"  And RFShistory.RFS_ID=RFS.RFS_ID

result is: 结果是:

     RFS_id  |  gate | End    | start 
     --------+-------+--------+-------
        12   |  aa   | 19/02  | 19/01
        12   |  bb   | 12/04  | 12/02
        12   |  cc   | 20/03  | 12/03
        12   |  dd   | 30/09  | 12/08

figure 3 图3

however I want to get a result like bellow format : 但是我想得到类似波纹管格式的结果:

 RFS_id  | gate_aa | gate_bb | gate_cc | gate_dd
 ----------------------------------------------
    12   | 30 days  |  60dyas | 8days   | 18days

gate_aa is duraion and it gets from start - end date . gate_aa是duraion,它从start - end datestart - end date Please help me to write single query to get this result. 请帮助我编写单个查询以获得此结果。

Use datediff() to get date difference and Pivot() to convert row into cloumn like here in your case gate wise column 使用datediff()获得日期差,并使用Pivot()将行转换为cloumn,如此处案例所示

Sample Syntax 样本语法

SELECT DATEDIFF(day,'2008-06-05','2008-08-05') AS DiffDate

Here you can find a solution to your pb: 在这里,您可以找到解决铅问题的方法:

mysql select dynamic row values as column names, another column as value mysql选择动态行值作为列名,另一列作为值

Here is how to do it for your problem: 这是解决您的问题的方法:

SET @sql = NULL; SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT CONCAT( 'sum(case when gate = ''', gate, ''' then days end) AS gate_', gate ) ) INTO @sql FROM RFSHistory; SELECT GROUP_CONCAT(DISTINCT CONCAT('sum(case gate =''',gate,'''然后天数结束的情况)AS gate_',gate))INTO @sql FROM RFSHistory;

SET @sql = CONCAT('SELECT RFSH.RFS_id, ', @sql, ' FROM (SELECT RFS_id, gate, DATEDIFF( STR_TO_DATE(concat( SUBSTRING( End ,4,2),\\'.\\',SUBSTRING( End ,1,2),\\'.\\',\\'2013\\'), GET_FORMAT(DATE, \\'USA\\')), STR_TO_DATE(concat( SUBSTRING( Start ,4,2),\\'.\\',SUBSTRING( Start ,1,2),\\'.\\',\\'2013\\'), GET_FORMAT(DATE, \\'USA\\')) ) as Days SET @sql = CONCAT('SELECT RFSH.RFS_id,',@sql,'FROM(SELECT RFS_id,gate,DATEDIFF(STR_TO_DATE(concat(SUBSTRING( End ,4,2),\\'。\\',\\ ,, SUBSTRING( End , 1,2),\\'。\\',\\'2013 \\'),GET_FORMAT(DATE,\\'USA \\')),STR_TO_DATE(concat(SUBSTRING( Start ,4,2),\\'。\\',SUBSTRING ( Start ,1,2),\\'。\\',\\'2013 \\'),GET_FORMAT(DATE,\\'USA \\')))作为天
FROM RFSHistory) as RFSH JOIN RFS ON RFSH.RFS_id = RFS.RFS_id WHERE RFS.name= \\'xx\\' GROUP BY RFSH.RFS_id'); 来自RFSHistory),作为RFSH在RFSH.RFS_id = RFS.RFS_id上加入RFS,其中RFS.name = \\'xx \\'GROUP BY RFSH.RFS_id');

PREPARE stmt FROM @sql; 从@sql准备stmt;

EXECUTE stmt; 执行stmt;

DEALLOCATE PREPARE stmt; 取消预备stmt;

Test it on SQLfiddle 在SQLfiddle上测试

You can use the below query for get the difference b/w dates 您可以使用以下查询获取黑白日期的差异

SELECT RFS.ID,(RFS_HISTORY.end_t-RFS_HISTORY.start_t) AS DiffDate,gate FROM RFS, RFS_HISTORY WHERE name='aa' And RFS_HISTORY.ID=RFS.ID group by RFS.ID,gate,RFS_HISTORY.end_t,RFS_HISTORY.start_t 选择RFS.ID,(RFS_HISTORY.end_t-RFS_HISTORY.start_t)作为DiffDate,从RFS,RFS_HISTORY WHERE name ='aa'和RFS_HISTORY.ID = RFS.ID按RFS.ID,gate,RFS_HISTORY.end_t,RFS_ID分组。 start_t

I think you want to convert rows into columns on the values. 我认为您想将行转换为值上的列。 This can be done with the help of pivoting. 这可以借助枢轴完成。

SELECT * FROM RFS, RFSHistory
pivot  for columname on [values]

I actually forgot the syntax but you can google it 我实际上忘记了语法,但是可以用谷歌搜索

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM