2014-09-01 57 views
0

有沒有辦法在Java中指定日期格式?我不是在詢問字符串格式。當我在REST服務檢查的日期值(在調試模式),它看起來像如下:傳遞日期對象到休眠查詢

Mon Sep 01 00:00:00 IST 2014 

當我通過這個日期Hibernate查詢,它不會雖然有回我任何結果,事件滿足標準的有效結果。以下是我的Hibernate查詢:

select this_.ID as ID1_59_0_, this_.SEVERITY as SEVERITY5_59_0_, this_.EVENT as EVENT2_59_0_, this_.PROCESS_NAME as PROCESS3_59_0_, this_.HOST_NAME as HOST6_59_0_, this_.TIME as TIME4_59_0_ 
from SYSTEM_LOG this_ 
where this_.TIME>? and this_.TIME<? 
order by this_.TIME asc 

我的MySQL運行此查詢,並通過通過如下的日期,它不返回任何數據,我相信這是發生了什麼事中的應用:

select this_.ID as ID1_59_0_, this_.SEVERITY as SEVERITY5_59_0_, this_.EVENT as EVENT2_59_0_, this_.PROCESS_NAME as PROCESS3_59_0_, this_.HOST_NAME as HOST6_59_0_, this_.TIME as TIME4_59_0_ 
from SYSTEM_LOG this_ 
where this_.TIME> 'Mon Sep 01 00:00:00 IST 2014' and this_.TIME<'Mon Sep 11 00:00:00 IST 2014' 
order by this_.TIME asc; 

但是,如果我按照如下所示更改日期,查詢返回的數據:

 select this_.ID as ID1_59_0_, this_.SEVERITY as SEVERITY5_59_0_, this_.EVENT as EVENT2_59_0_, this_.PROCESS_NAME as PROCESS3_59_0_, this_.HOST_NAME as HOST6_59_0_, this_.TIME as TIME4_59_0_ 
from SYSTEM_LOG this_ 
where this_.TIME> '2014/9/1' and this_.TIME<'2014/9/11' 
order by this_.TIME asc; 

如何使用正確的日期格式?我試着做以下,但仍顯示日期相同的格式:

DateFormat formatter = new SimpleDateFormat("MM-dd-yyyy", Locale.ENGLISH); 
     Date sDate = formatter.parse(startDate); 
     Date eDate = formatter.parse(endDate); 

更新: 下面是Hibernate的方法我用檢索數據:

public PagedDataResult getSystemLogsByDate(Date startDate, Date endDate, String sortColumn, int searchBySeverity, 
              String searchByProcessName, String searchByHostName, String searchByDescription, 
              int page, int pageSize) { 
    String sortField = "time"; 
    List<Criterion> criteria = new ArrayList<Criterion>(); 
    criteria.add(Restrictions.gt(sortField, startDate)); 
    criteria.add(Restrictions.lt(sortField, endDate)); 
    if(searchBySeverity >= 0) 
     criteria.add(Restrictions.eq("alarmSeverities.id", searchBySeverity)); 
    if(!searchByProcessName.isEmpty()) 
     criteria.add(Restrictions.like("processName", searchByProcessName)); 
    if(!searchByHostName.isEmpty()) 
     criteria.add(Restrictions.like("servers.hostName", searchByHostName)); 
    if(!searchByDescription.isEmpty()) 
     criteria.add(Restrictions.like("event", searchByDescription)); 
    return (PagedDataResult)getAllBySort(sortColumn, page, pageSize, criteria); 
} 
+0

如何在數據庫中定義的日期?你在java代碼中使用了PreparedStatement嗎?如果是這樣設置參數使用java.sql.Date – 2014-09-01 04:31:00

+0

日期是一個時間戳 – devC 2014-09-01 06:27:50

+0

乾杯的信息CHAT = 2013,請參閱我的回答 – 2014-09-01 06:42:44

回答

0

下面是一些代碼,我會檢索使用時間戳

java.util.Date date = getItSomehow(); 
Timestamp timestamp = new Timestamp(date.getTime()); 
preparedStatement = connection.prepareStatement("SELECT * FROM tbl WHERE ts > ?"); 
preparedStatement.setTimestamp(1, timestamp); 

方法getItSomehow將您的字符串轉換爲使用SimpleDateFormat的一個日期。

根據您從您的REST系統獲取字符串,面膜會

EEE MMM HH:mm:ss yyyy Z -> Mon Sep 01 00:00:00 IST 2014 

基於更新的代碼,嘗試

criteria.add(Restrictions.gt(sortField, new Timestamp(startDate.getTime()))); 
criteria.add(Restrictions.lt(sortField, new Timestamp(endDate.getTime()))); 
+0

請參閱我的更新回答 – 2014-09-01 06:52:51

+0

嗨,現在,我已將日期轉換屬性轉換爲短日期格式,如我所需。但是,hibernate查詢現在會拋出一個錯誤 - 「java.sql.SQLException:getInt() - 'stinga_1''」的值無效。唯一有效的標準是兩個日期,因爲我現在沒有設置其他標準​​限制。 – devC 2014-09-01 10:37:20

-1

那也許是因爲你」重新使用java.util.Date而不是java.sql.Date。嘗試將您的導入更改爲java.sql.Date並查看它是否可行。

+0

也許你的意思是,這應該是一個評論 – 2014-09-01 04:32:11

0

我明白的是你必須爲你speciified一個日期字符串,你想用它來選擇查詢,那麼你需要將其更改爲SQL格式的日期以下列方式

首先從StringDate變換到java.util.Date

public static java.util.Date transformFromStringToDate(String dateInString){ 
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH); 
java.util.Date utilDate = null; 
try { 
    if(dateInString != null && !(dateInString.equals(""))) { 
    utilDate = dateFormat.parse(dateInString); 
} 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 
    return utilDate; 
} 

與java.util.Date然後轉換爲java.sql.Date

public static java.sql.Date convertUtilDateToSqlDate(java.util.Date date){ 
    if(date != null && !(date.equals(""))) { 
     Date sqlDate = new Date(date.getTime()); 
     return sqlDate; 
    } 
     return null; 
    } 

最後使用java.sql.Date在您查詢的PreparedStatement的

如果直接有java.util.Date然後跳過第一步

編輯

如果列是你需要的java.util.Date轉換爲java.sql.Timestamp這樣

public java.sql.Timestamp convertUtilDateToSqlTimestamp(java.util.Date date){ 
    if(date != null && !(date.equals(""))) { 
     Timestamp sqlTimestamp = new Timestamp(date.getTime()); 
     return sqlTimestamp ; 
    } 
     return null; 
    } 
public PagedDataResult getSystemLogsByDate(Date startDate, Date endDate,..) { 
    java.sql.Timestamp startTimestamp = new YourClassName() 
             .convertUtilDateToSqlTimestamp(startDate); 
    java.sql.Timestamp endTimestamp = new YourClassName() 
             .convertUtilDateToSqlTimestamp(endDate); 
... 
criteria.add(Restrictions.gt(sortField, startTimestamp)); 
criteria.add(Restrictions.lt(sortField, endTimestamp)); 
... 
} 
一個 timestamp

有這種方法將日期轉換爲SQL時間戳並使用轉換時間戳來查詢

+0

除非我們知道如何存儲日期在數據庫中,那麼任何答案只是一個猜測。 – 2014-09-01 05:00:12

+0

我以爲MySQL存儲格式爲yyyy-MM-dd – SparkOn 2014-09-01 05:01:39

+0

如果它是一個日期,並且您正在使用PreparedStatement,那麼您不必擔心格式。但是,如果他們將日期存儲爲字符串,那麼我們也需要知道。 – 2014-09-01 05:08:51

-1

默認情況下,mySql使用瑞典語區域設置,所有日期必須提交爲'2014-08-26'。將日期格式化程序更改爲SimpleDateFormat(「yyyy-MM-dd」,區域設置。英語);