我正在用Java創建一個小程序。日期字段是一個組合框,用於只選擇月份和日期爲02/2016
。是否有一種方法可以在mysql中記錄此日期格式僅在mm/yy字段中?在MySQL數據庫中只創建月份和年份列
回答
而不是以這種格式存儲它,也許最好的辦法是將它存儲爲一個正常的日期,並且一直設置爲該月的第一天。 然後在檢索的時候,將日期格式化爲SimpleDateFormat格式,只獲取月份和年份並將其返回給用戶界面。
你是對的,而且我爲他們所做的第一個真正的問題是,在每個月底,子辦事處都會在總部發送紙質數據,因爲子辦事處沒有數據庫。必須存儲在數據庫中的數據以發送紙質表格的形式恢復辦公室的財務狀況。因此在現有數據庫中,對於那些信息,僅需要涉及的月份和年份,而不是它們。 –
你不需要在你的用戶界面中查詢這一天。按照您現在的做法,只問月份和年份。但是,當您在後端接收到信息時,請在將日期(例如月底)添加爲MySql之前,將其作爲實際日期。如果在數據庫中有一些只有月份和年份信息的數據作爲字符串,最好將它們遷移到實際日期,以便能夠對它們執行範圍和比較操作,並且具有高效和一致的索引。 –
你不應該這樣做,並且沒有原生的方式來做到這一點。只需將它保存爲mysql中的正常DATE,並在查詢數據庫SELECT MONTH(datefield), YEAR(datefield)
或使用java解析日期時。 mysql日期和日期時間類型由包含一天(或包括時間)的日期組成。爲了能夠查詢範圍和其他日期相關的東西,你應該堅持存儲日期的預期方式。 Mysql具有出色的日期時間功能,你不應該做一些讓他們離開你的東西。
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項目YearQuarter
和Quarter
類。
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::setObject
和ResultSet::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類?
- Java SE 8和SE 9後來
- 內置。
- 帶捆綁實現的標準Java API的一部分。
- Java 9增加了一些次要功能和修復。在ThreeTen-Backport
- Java SE 6和SE 7
- 大部分的java.time功能後移植到Java 6 & 7。
- Android
- 的ThreeTenABP項目適應ThreeTen-反向移植(上述)爲Android特異性。
- 請參閱How to use…。
的ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval
,YearWeek
,YearQuarter
和more。
如果在數據庫中,我將它作爲文本列或字符串存儲,是否可以有一個SQL請求,比如'select * from table_name where date date between dat1 and date2'?由於此請求使用數字和日期格式,但日期與文本列一樣,我不確定它會起作用 –
如果您只關注年份,則日期無關緊要。此外,您還有迄今爲止忽略的時區這個至關重要的問題。對於任何特定時刻,日期因地區而異。搜索堆棧溢出*瞭解更多信息。如果您正在存儲的內容類似於信用卡過期,那麼此答案就足夠了。對於一個範圍,例如第一季度(1月 - 3月),搜索'WHERE到期日期='2016-01'和到期日期<='2016-03''。 –
- 1. Mysql月份和年份的數據
- 2. 只月份和年份
- 3. 商店月份和年份在mysql數據庫
- 4. 如何根據當前月份和年份創建mysql表名
- 5. mysql數據類型只存儲月份和年份
- 6. 創建的年份和月份
- 7. 在年份和月份中獲取數據庫中的記錄
- 8. MySQL中按年份和月份分組
- 9. 在Oracle數據庫中返回月份和年份
- 10. SQL Server 2008中選擇數據只月份和年份
- 11. Django SelectDateWidget只顯示月份和年份
- 12. 在mysql中選擇月份日年份?
- 13. 如何在MySQL數據庫中最好地存儲年份,月份和日期?
- 14. 比較月份和年份Mysql
- 15. MySQL查詢匹配月份和年份
- 16. Mysql - 獲取月份和年份#
- 17. 從數據庫中選擇月份和年份的日期
- 18. 創建月份和年份列,以加快時間戳查詢
- 19. T-SQL:從月份列中合併當前年份和月份
- 20. MySQL STR_TO_DATE字符串只有月份和年份或只有一年
- 21. PHP創建年份和月份的多層數組
- 22. MySQL查詢返回每年的年份,月份和總行數
- 23. 如何在數據庫中存儲年份月份?
- 24. 如何從laravel的數據庫中的列中獲取月份和年份?
- 25. 我必須從輸入的月份/年份打印月份和年份到當前的月份和年份
- 26. 有月份和年份PHP
- 27. 結合年份和月份
- 28. 減去年份和月份
- 29. 按年份和月份
- 30. LINQ - 按年份和月份
至少,以yyyymm格式存儲它。 – Strawberry
@Strawberry其實,[YYYY-MM](https://en.wikipedia.org/wiki/ISO_8601#Calendar_dates)是[標準格式](https://en.wikipedia.org/wiki/ISO_8601)。 –