2015-04-07 91 views
0

我是MySql數據庫的新手,目前面臨日期格式問題。我嘗試了一些來自互聯網的解決方案,但沒有成功。因此我在這裏發佈這個問題。mysql日期語法問題

我有一個圖形用戶界面,我提供的日期作爲輸入,這是「mm/dd/yyyy」格式。

這是我的代碼,包含查詢:

public boolean fetchAPReportDomino(Date edDate, APReport apReport){ 
    Statement stmt=null; 
    ResultSet rs=null; 
    SimpleDateFormat sd= new SimpleDateFormat("MM/dd/yyyy"); 
    SimpleDateFormat sd1=new SimpleDateFormat("yyyy-MM-dd"); 
    String tempDate=sd.format(edDate); 
    if(getConnection()!=null){ 

      try { 
       stmt= getConnection().createStatement(); 

       String query="SELECT * FROM AP_Report where Edition Date = " + tempDate; 
       rs = stmt.executeQuery(query); 
       while (rs.next()) { 
        apReport.setRoomHumidity(rs.getInt("Room Humidity")); 
        apReport.setRoomTemperature(rs.getInt("Room Temperature")); 
       } 
       rs.close(); 
       stmt.close(); 

      } catch (SQLException ex) { 
       Logger.getLogger(DataService.class.getName()).log(Level.SEVERE, null, ex); 
       return false; 
      } 
    } 
    return true; 
} 

從MySQL工作臺,我試圖改變日期字段爲「DATE」,「時間戳」,「DATETIME」的數據類型。但沒有任何幫助。

以下是林看到的錯誤,當我執行的代碼:下面的表結構

SEVERE: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Date = 02/14/2015' at line 1 

發帖截圖:

http://prntscr.com/6qz5my 
+1

瞭解預準備語句,並將Date作爲java.sql.Date類型的參數傳遞。不通過連接字符串:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html –

+0

另外,數據庫上的日期字段不能是「Edition Date」(帶空格),除非它是用反引號創建,所以你必須使用它! –

+0

你能否提供我們的表格結構? – ifm

回答

2

首先永遠不要創建數據庫字段,就像是用簡單的名稱空格(例如Edition Date)之間的單詞這是一個非常不好的練習,它使編程時使用它更糟糕。 這是你在評論中添加的圖像: enter image description here

我強烈建議你更改爲類似edition_date。數據庫字段不需要很容易理解。

因爲你創造一樣,你必須使用backtics在你的數據庫上運行的所有查詢`與字段的字段,否則SQL解析器不知道如何識別有像Edition Date

一個名稱的字段

錯誤您所看到的:

...server version for the right syntax to use near 'Date = 02/14/2015' at line 1 

美國正是我所說的有關字段名稱顯示它您'Date = 02/14/2015'因爲SQL解析器認爲Edition字是一個命令或操作員,因此休息它無法識別。

使用它創建查詢正確的做法是這樣的:

String query="SELECT * FROM AP_Report where `Edition Date` = " + tempDate; 

看到反引號?

但這種方式仍然是錯誤的,因爲你的查詢是沒有準備好的語句的字符串,這意味着你必須用單引號來包裝你的價值tempDate所以正確的方法是:

String query="SELECT * FROM AP_Report where `Edition Date` = '" + tempDate + "'"; 

但它仍然有一個問題,比較作爲字符串MySQL默認日期格式爲yyyy-MM-dd看到它在這裏:Date Example(第二查詢獲取任何事情,因爲格式)

在你的代碼是在格式化是要在查詢中使用的日期與此代碼:

SimpleDateFormat sd= new SimpleDateFormat("MM/dd/yyyy"); 
SimpleDateFormat sd1=new SimpleDateFormat("yyyy-MM-dd"); 
String tempDate=sd.format(edDate); 

你對你的查詢中使用sd時,你應該使用sd1所以

String tempDate=sd1.format(edDate); 

之後,你可以使用查詢:

String query="SELECT * FROM AP_Report where `Edition Date` = '" + tempDate + "'"; 

注:我不真的記得,如果您在檢索apReport.setRoomHumidity(rs.getInt("Room Humidity"));的值時必須使用反引號,那麼您應該測試apReport.setRoomHumidity(rs.getInt("`Room Humidity`"));如果第一個方式不起作用。

而對於知識的緣故,你應該使用準備聲明,在你的代碼會是這樣考慮的:

//... 

String query="SELECT * FROM AP_Report where `Edition Date` = ?" 
PreparedStatement pstmt = getConnection().prepareStatement(query); 

//note that depending on your date type you will need just one 
//of the lines below 

//if your edDate is a java.util.Date use as: 
pstmt.setDate(new java.sql.Date(edDate.getTime())); 
//if it is already a java.sql.Date 
pstmt.setDate(edDate); 

rs = pstmt.executeQuery(query); 

//... 

希望它清除出來的東西給你。

-1

您的問題是,你需要圍繞在日報價請求參數。使用下面的引號和df1應該可以工作。

String query="SELECT * FROM AP_Report where Edition Date = '" + tempDate + "'"; 

我還建議在將變量替換到查詢中時查看PreparedStatement。

+0

這個答案是錯誤的,因爲錯誤細節說的字段'日期',他試圖查詢它應該是'\'版本日期\ ''帶有backtics –

-1

日期參數必須是 '' 等的字符串數據:

串查詢= 「SELECT * FROM AP_Report其中Edition日期= '」 + tempDate + 「'」;

+0

這個答案是錯誤的,因爲錯誤細節中提到的關於他正在試圖查詢的字段'Date'應該是'\'版本日期''帶有backtics –

0

我覺得你的問題是在您的列名的空格, 嘗試像`版Date`(或雙引號)