2016-11-25 150 views
1

我正在用Java創建一個小程序。日期字段是一個組合框,用於只選擇月份和日期爲02/2016。是否有一種方法可以在mysql中記錄此日期格式僅在mm/yy字段中?在MySQL數據庫中只創建月份和年份列

+0

至少,以yyyymm格式存儲它。 – Strawberry

+0

@Strawberry其實,[YYYY-MM](https://en.wikipedia.org/wiki/ISO_8601#Calendar_dates)是[標準格式](https://en.wikipedia.org/wiki/ISO_8601)。 –

回答

0

而不是以這種格式存儲它,也許最好的辦法是將它存儲爲一個正常的日期,並且一直設置爲該月的第一天。 然後在檢索的時候,將日期格式化爲SimpleDateFormat格式,只獲取月份和年份並將其返回給用戶界面。

+0

你是對的,而且我爲他們所做的第一個真正的問題是,在每個月底,子辦事處都會在總部發送紙質數據,因爲子辦事處沒有數據庫。必須存儲在數據庫中的數據以發送紙質表格的形式恢復辦公室的財務狀況。因此在現有數據庫中,對於那些信息,僅需要涉及的月份和年份,而不是它們。 –

+0

你不需要在你的用戶界面中查詢這一天。按照您現在的做法,只問月份和年份。但是,當您在後端接收到信息時,請在將日期(例如月底)添加爲MySql之前,將其作爲實際日期。如果在數據庫中有一些只有月份和年份信息的數據作爲字符串,最好將它們遷移到實際日期,以便能夠對它們執行範圍和比較操作,並且具有高效和一致的索引。 –

0

你不應該這樣做,並且沒有原生的方式來做到這一點。只需將它保存爲mysql中的正常DATE,並在查詢數據庫SELECT MONTH(datefield), YEAR(datefield)或使用java解析日期時。 mysql日期和日期時間類型由包含一天(或包括時間)的日期組成。爲了能夠查詢範圍和其他日期相關的東西,你應該堅持存儲日期的預期方式。 Mysql具有出色的日期時間功能,你不應該做一些讓他們離開你的東西。

0

ISO 8601

ISO 8601標準定義多種格式用於表示日期時間值的字符串。其中一個是一年零一個月,沒有任何日期,沒有時區,也沒有時間:YYYY-MM。例如:2016-02二月2016年

數據庫存儲

在數據庫中保存的文本列這些標準的字符串。請注意,按字母排序也意味着按時間排序。

的Java

的java.time類解析/生成的字符串表示日期時間值時使用ISO 8601標準格式默認。

YearMonth類代表沒有日期的年份值。在你的應用程序中,使用這些對象而不是單純的字符串或數字。這樣做可以提供類型安全性,確保有效的值,並使代碼更加自我記錄。

YearMonth ym = YearMonth.of(2016 , 2); 
String output = ym.toString(); // 2016-02 

然後去解析一個標準字符串。按字母順序排序時

YearMonth ym = YearMonth.parse("2016-02"); 

查詢

可以進行文本查詢作爲標準格式是按時間順序。該ISO委員會的人非常聰明。

例如,查詢值在2016年第一季度:

WHERE expiration >= '2016-01' 
AND expiration <= '2016-03' 

此外,在日期時間的工作,我們通常在開始使用半開方法的時間跨度是包括而結尾是獨家

WHERE expiration >= '2016-01' 
AND expiration < '2016-04' // Up to, but not including, the month at end of this span. 

當然,你真的應該使用PreparedStatement而不是原始SQL查詢。

YearMonth q2016_ymStart = YearMonth.of(2016 , 1); // 2016-01 
YearMonth q2016_ymStop = q2016_ymStart.plusMonths(3); // 2016-04 for half-open quarter. 
… 
myPreparedStatement.setString(… , q2016_ymStart.toString()); 
myPreparedStatement.setString(… , q2016_ymStop.toString()); 

及宿舍來說,看到ThreeTen-Extra項目YearQuarterQuarter類。

LocalDate

要變換YearMonth爲日期,使用LocalDate類。

LocalDate firstOfMonth = ym.atDay(1); 
LocalDate endOfMonth = ym.atEndOfMonth(); 

ZonedDateTime

要變換YearMonth成一個時刻在時間軸上,指定由您的業務方案的預期背景下的時區。讓java.time確定當天的第一時刻,第一時刻是總是00:00:00

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ym.atDay(1).atStartOfDay(z); 

數據庫訪問

對於數據庫的訪問,你的JDBC 4.2兼容的驅動程序可能能夠直接通過調用PreparedStatement::setObjectResultSet::getObject方法處理這些java.time類型。

如果不能,回落到轉換java.time類型使用添加到這些老班新方法的老的java.sql類型。搜索堆棧溢出瞭解更多信息。


關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore

+0

如果在數據庫中,我將它作爲文本列或字符串存儲,是否可以有一個SQL請求,比如'select * from table_name where date date between dat1 and date2'?由於此請求使用數字和日期格式,但日期與文本列一樣,我不確定它會起作用 –

+0

如果您只關注年份,則日期無關緊要。此外,您還有迄今爲止忽略的時區這個至關重要的問題。對於任何特定時刻,日期因地區而異。搜索堆棧溢出*瞭解更多信息。如果您正在存儲的內容類似於信用卡過期,那麼此答案就足夠了。對於一個範圍,例如第一季度(1月 - 3月),搜索'WHERE到期日期='2016-01'和到期日期<='2016-03''。 –