From f13d4efcdb2bb3072b9243ee022a5eb27be87a5f Mon Sep 17 00:00:00 2001 From: Eilert Tunheim <emtunhei@stud.ntnu.no> Date: Fri, 25 Mar 2022 10:59:52 +0100 Subject: [PATCH] Implemented today's date into the sql statements --- .../java/com/application/DB/Constants.java | 24 +++++++++ src/main/java/com/application/DB/DB.java | 49 +++++++++--------- .../com/application/DB/Constants.class | Bin 0 -> 1028 bytes target/classes/com/application/DB/DB.class | Bin 10226 -> 10348 bytes 4 files changed, 49 insertions(+), 24 deletions(-) create mode 100644 target/classes/com/application/DB/Constants.class diff --git a/src/main/java/com/application/DB/Constants.java b/src/main/java/com/application/DB/Constants.java index ae70439..65b1741 100644 --- a/src/main/java/com/application/DB/Constants.java +++ b/src/main/java/com/application/DB/Constants.java @@ -1,14 +1,38 @@ package com.application.DB; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Calendar; +import java.util.Date; + /** * This class contains constants to be used related to database activities */ public final class Constants { + // Format for today's date + static DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private Constants() { // Empty constructor } + // Today's date + public static final String TODAYS_DATE = format.format(LocalDateTime.now()); + + // Database ID/name public static final String PROJECT_ID = "sf-drying-optimization"; + // Location Valasen + public static final int LOCATION_ID = 124; + public static final String TABLE_NAME_VALMATICS = "int_dk_valmaticsdryingbatches_v2"; + public static final String TABLE_NAME_KWH = "int_sd_winccsensordata"; + + // Location Arjang + /* + public static final int LOCATION_ID = 174; + public static final String TABLE_NAME_VALMATICS = "int_dk_valmaticsdryingbatches"; + public static final String TABLE_NAME_KWH = "int_sd_swappconsensordata"; + */ + } diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java index b425377..eb340cd 100644 --- a/src/main/java/com/application/DB/DB.java +++ b/src/main/java/com/application/DB/DB.java @@ -158,7 +158,7 @@ public class DB { // Preparing a query statement /* final String sqlStatement = "SELECT DISTINCT TimeStamp, VariantValue " + - "FROM sf-drying-optimization.124.int_sd_winccsensordata " + + "FROM `" + PROJECT_ID + "." + LOCATION_ID + "." + TABLE_NAME_KWH + "` " + "WHERE TimeStamp BETWEEN " + '"'+ entry.getKey() + '"' + " AND " + '"' + entry.getValue() + '"' + " ORDER BY TimeStamp ASC"; @@ -168,7 +168,7 @@ public class DB { // Preparing a query statement // Query statement 124 Valåsen final String sqlStatement = "SELECT `TimeStamp`, `VariantValue` " + - "FROM `sf-drying-optimization.124.int_sd_winccsensordata` " + + "FROM `" + PROJECT_ID + "." + LOCATION_ID + "." + TABLE_NAME_KWH + "` " + "WHERE TimeStamp BETWEEN " + '"'+ entry.getKey() + '"' + " AND " + '"' + entry.getValue() + '"' + " AND ValueID = 51" + @@ -178,12 +178,13 @@ public class DB { /* // Query statement 174 Årjang final String sqlStatement = - "SELECT Timestamp, RealValue FROM `sf-drying-optimization.174.int_sd_swappconsensordata` " + - "WHERE TimeStamp BETWEEN " + '"'+ entry.getKey() + '"' + - " AND " + '"' + entry.getValue() + '"' + - "AND ValueID = 19 " + - "AND RealValue <> 0 " + - "ORDER BY TimeStamp ASC"; + "SELECT Timestamp, RealValue + "FROM `" + PROJECT_ID + "." + LOCATION_ID + "." + TABLE_NAME_KWH + "` " + + "WHERE TimeStamp BETWEEN " + '"'+ entry.getKey() + '"' + + " AND " + '"' + entry.getValue() + '"' + + "AND ValueID = 19 " + + "AND RealValue <> 0 " + + "ORDER BY TimeStamp ASC"; */ @@ -210,16 +211,12 @@ public class DB { // Riktig format, men i string String formatedTimeStamp = getDateFormat().format(timeStamp); -/* - // Checks for negative values and unresonable large values - if(variantValue > 0){ //&& variantValue < 5000000){ + // Checks for negative values + if(variantValue > 0) { // Adding the data to a list in order to sort through later data.put(formatedTimeStamp, variantValue); } - */ - data.put(formatedTimeStamp, variantValue); - //System.out.printf("Timestamp: \t%s\t\t\tkWh: \t%s\t\t\tBaseline: %s\n",formatedTimeStamp,variantValue,baseline); // Checks if the data is empty } @@ -243,7 +240,6 @@ public class DB { System.out.printf("Timestamp: \t%s\t\t\tkWh: \t%s\n",entry.getKey(),entry.getValue()); } - return sortedFinalResults; } @@ -280,21 +276,26 @@ public class DB { // Sqlstatement for Valåsen(124) final String sqlStatement = - "SELECT MAX(Name) as DryingSchedule, MAX(KilnName) as Kiln_name, DryingStarted, Max(CalculatedStop) as CalculatedStop\n" + - "FROM `sf-drying-optimization.124.int_dk_valmaticsdryingbatches_v2` \n" + - "WHERE KilnName = 5 \n" + - "AND DATE(DryingStarted) BETWEEN \"1990-08-17\" AND \"2022-08-17\"\n" + - "AND DATE(CalculatedStop) BETWEEN \"1990-08-17\" AND \"2022-08-17\"\n" + - "AND DATE(CalculatedStart) BETWEEN \"1990-08-17\" AND \"2022-08-17\"\n" + - "Group by DryingStarted\n" + - "Order by DryingStarted ASC"; + "SELECT MAX(Name) as DryingSchedule, MAX(KilnName) as Kiln_name, DryingStarted, Max(CalculatedStop) as CalculatedStop " + + "FROM `" + PROJECT_ID + "." + LOCATION_ID + "." + TABLE_NAME_VALMATICS + "` " + + "WHERE KilnName = 5 " + + //"AND DATE(DryingStarted) BETWEEN \"1990-08-17\" AND \"2022-08-17\" " + + //"AND DATE(CalculatedStop) BETWEEN \"1990-08-17\" AND \"2022-08-17\" " + + //"AND DATE(CalculatedStart) BETWEEN \"1990-08-17\" AND \"2022-08-17\" " + + "AND DryingStarted BETWEEN \"1990-01-01 00:00:00\" AND \"" + TODAYS_DATE + "\" " + + "AND CalculatedStop BETWEEN \"1990-01-01 00:00:00\" AND \"" + TODAYS_DATE + "\" " + + "AND CalculatedStart BETWEEN \"1990-01-01 00:00:00\" AND \"" + TODAYS_DATE + "\" " + + "Group by DryingStarted " + + "Order by DryingStarted ASC "; + + System.out.println(sqlStatement); /* // Sqlstatement for Årjang(174) final String sqlStatement = "SELECT MAX(Name) as DryingSchedule, MAX(KilinId)+1 as KilnName, DryingStarted, Max(DryingCompleted) as DryingCompleted\n" + - "FROM `sf-drying-optimization.174.int_dk_valmaticsdryingbatches` \n" + + "FROM `" + PROJECT_ID + "." + LOCATION_ID + "." + TABLE_NAME_VALMATICS + "` " + "WHERE KilinId = 16 \n" + "AND DATE(DryingStarted) BETWEEN \"1990-08-17\" AND \"2022-08-17\"\n" + "AND DATE(DryingCompleted) BETWEEN \"1990-08-17\" AND \"2022-08-17\"\n" + diff --git a/target/classes/com/application/DB/Constants.class b/target/classes/com/application/DB/Constants.class new file mode 100644 index 0000000000000000000000000000000000000000..36d1dfcf105d9904e54bdde59aeb74409a514b91 GIT binary patch literal 1028 zcmX^0Z`VEs1_l!bb1nu>1|<##WiAF4231Z54hA(Y26YAv5LXk#)naGRW@pf0WME6n zFUn0UVPsJ8$x19s)Gx`*P1T2p>ANJBq=sbXrn-TZl%y6}Gcs_8_`5hp2FJTNhPW~^ z2thREB<7{-2bUCO=A~ORGH?Y1`FpuKhs1ljFf#Bu=jRodB<7WbCFYc-axmyJGI0C& zJ3EGW`ul+uFnTgGFfi0GGKhpYI{CQ9`#Ji$#)moj_&SDoItOzw=rJ<zA<1}$dvGx5 zGcvH*Waed-*fBCNYiNcsGO#%3r=&76@cU%urTUfTCZ!gIBqrsgf?SxNoR|}qSd<Ck zLj_q%GBS%98RUGD^K<nR3kq^FlM_oa^Yipwob+MtEw*N4;IK)~fm*{AoL^d$oa&Yd zGL#RlNDmZfJPZ;Hl8g+(m6es1y1u@;DJcpb9#*-zR>j5a3<f+5h73kL3|tJ{><q>{ z3?>YwAdVRi0}lf)BZCY+ConPyfXvqihp&H9R%&tyBZF9Rnr=!_WoBNwZhk>YW^QH` z*zJrA3YmE&@hREyWr;bti6xoI#Sm3Vi6zMysm1YSMvM$%ASJ~q@#UF$$;rj3dByof zDTyVCj0{R(d+<g+BLioCT0mk+Nor9ZBZGwoX4Gp!gz%bT&B!2*u*(M&Ik05L$iSSJ zU(U!Nt$}P1iV|x^21}^LU|UL3a|`l|5_9xJpbW?4<kaHg{32_p5#W%6rc4Gy1`Y;J z1_lN;1`bekFfcGkf+7J-^D*!;Ff#BnFfcGN2rx)82r>x4`N9m63?fMKq70G@Vn}>( z1||k3P#R!hWRPNDU@&H2WME`qU|`kS&cL`4Y@{>;0|OTW69WT-00Rqy5Q7W@0|O64 z5rZs)90LOb2ZKC=B-8*yuu297Q6Z)s49uGuST-@R>|kKs#=y3jfgNNZBLl)fJ_Zg3 MQ3gf^1+Ybm0Nt(i;s5{u literal 0 HcmV?d00001 diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class index 30cd375022bc63510dd2aad4cd576d38dced7e46..386565ccedb8265adb368a8df6a4c7ae9917907c 100644 GIT binary patch delta 4288 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 PpFlJtD<d<*YX(UGq6LiU delta 4184 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 CXk=&r -- GitLab