簡體   English   中英

SQL和Java的日期比較

[英]Date Comparison of SQL and Java

我想比較兩個日期,第一個日期是從系統日期中獲取的,另一個是我正在通過一個查詢獲取的。 但是這里的問題是兩個日期都與我看到的相同,但是在If else函數中我得到了不同的結果。 下面是我的代碼,在輸出部分中,我給出了相應的功能將輸出哪個輸出?

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date currdate = new Date();
System.out.println("****"+dateFormat.format(currdate));

輸出是:-2014-01-21

stat = con.prepareStatement("select date from finaltbale where tl_id='"+tempmaxid+"'");
rs = stat.executeQuery();
rs.next();
Date tempdate = rs.getDate(1);

輸出是:-2014-01-21

if(tempdate.equals(currdate)){

        System.out.println("Dates are same");

        }

        else{

        System.out.println("Dates are different");

        }

輸出為:-日期不同

您獲得的系統日期還將包括小時,分鍾,秒和毫秒。 您只打印年,月和日。 因此,當您打印它們時,它們的外觀將相同,但是當您將它們與.equals進行比較時,由於日期的時間部分不同,它將返回false。

您可以格式化日期並比較格式中的字符串以查看它們是否相同

if(dateFormat.format(tempdate).equals(dateFormat.format(currdate))){...}

我不推薦比較字符串,但是在這種情況下,您可能需要將if中的equals更改為match ,因為equals與另一個對象進行比較,因此兩個日期可能具有相同的值,但它們卻完全不同,匹配項與正則表達式進行比較。

做到這一點的另一種方法是通過Calendar方法, afterbeforecompareTo 之后是最好的方法。

Java Devil答案是正確的。

詳細說明…

在Java,JDBC和SQL領域,“日期”是一個棘手的詞。

您正在ResultSet上調用getDate 這將呈現一個java.sql.Date-注意中間的sql java.sql.Date是一個java.util.Date,已調整為UTC / GMT中的零時間(00:00:00.000)(無時區偏移)。 該調整意味着自歷元以來的內部毫秒數。

我假設您的行Date currdate = new Date(); 正在使用java.util.Date。 在混合這種SQL和非SQL代碼時,應在這些類上顯式指定軟件包。

因此,您正在比較包含不同毫秒數的對對象。

在java.util.Date和java.sql.Date對象上調用getTime()方法,以查看它們自epoch以來的毫秒數。

順便說一句,由於java.util.Date和java.sql.Date上的toString方法在呈現字符串時都應用了JVM的默認時區,這使情況變得復雜。 但是,兩個對象實際上都沒有包含時區,只是從1970年開始UTC / GMT以來的毫秒數(無時區偏移)。

在SQL中,要捕獲日期和時間,請使用標准TIMESTAMP類型或特定數據庫提供的專有類型。

喬達時代

Joda-Time 2.3庫在這里可能會有所幫助。 將java.sql.Date或java.util.Date對象與UTC時區對象一起傳遞給DateTime構造函數,以清晰地了解所使用的值。

java.util.Date date = new java.util.Date( 1390276603054L );
DateTime dateTimeUtc = new DateTime( date, DateTimeZone.UTC );
System.out.println( "dateTimeUtc: " + dateTimeUtc );

運行時...

2014-01-21T03:56:43.054Z

小費

在旁注...

a_horse_with_no_name對問題的評論是正確的:“ date”是數據庫中列的可怕名稱。 這是我所學到的關於SQL的最有價值的提示...

SQL標准保證在任何標識符中都不會使用結尾的下划線

因此,如果為每列命名都帶有下划線,則不必擔心與標准和各種數據庫中許多專有擴展定義的許多關鍵字和其他標識符發生沖突。

因此,請使用date_

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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