yyyy與yyyy 日期比較問題

2021-10-03 06:43:49 字數 2219 閱讀 1202

在2023年1月1日生成的交易日期為2023年12月31日的交易記錄檔案中,出現了很多歷史交易,例如交易時間2023年8月8日的交易資料。在2023年及2023年1月其他時間,未出現該問題。(資料庫使用mysql)

檢視歷史**,找到生成交易記錄檔案相關的處理,會從資料庫查詢前一天的交易記錄,生成檔案。

從資料庫查詢前一天的交易記錄的sql語句可以簡化如下(欄位trans_date為交易日期,型別為字串):

select

*from test_table where trans_date >=

[前一天日期,格式:yyyy-mm-dd]

and trans_date <

[當天日期,格式:yyyy-mm-dd]

;

在2023年1月1日,生成交易日期為2023年12月31日的交易記錄檔案時,執行的sql如下:

select

*from test_table where trans_date >=

'2019-12-31'

and trans_date <

'2020-01-01'

;

執行以上sql後,查詢結果**現了trans_date為「20190808」等日期的資料。

「20190808」看起來並不滿足大於等於』2019-12-31』且小於』2020-01-01』的條件。

執行以下sql語句,結果為「1 1」,說明「20190808」確實滿足大於等於』2019-12-31』且小於』2020-01-01』的條件。

select concat(

'20190808'

>=

'2019-12-31'

,' '

,'20190808'

<

'2020-01-01'

);

檢視』-'與』0』對應的ascii碼的十六進製制:

select concat(hex(

'-')

,' '

, hex(

'0')

);

以上結果為「2d 30」,即』-'的ascii碼為0x2d,『0』的ascii碼為0x30,』-'小於0~9的任意數字。

以上的日期比較sql語句可以簡化如下:

select concat(

'20190'

>=

'2019-'

,' '

,'201'

<

'202'

);

由於』0』大於』-』,且』1』小於』2』,因此以上兩個條件均能滿足,上述執行結果為「1 1」。

在2023年的其他日期,例如2023年12月31日執行以上sql時,sql語句如下:

select concat(

'20190808'

>=

'2019-12-30'

,' '

,'20190808'

<

'2019-12-31'

);

後乙個條件不滿足,執行結果為「1 0」。

在2023年的其他日期,例如2023年1月2日執行以上sql時,sql語句如下:

select concat(

'20190808'

>=

'2020-01-01'

,' '

,'20190808'

<

'2020-01-02'

);

前乙個條件不滿足,執行結果為「0 1」。

因此當通過「trans_date >= [前一天日期,格式:yyyy-mm-dd] and trans_date < [當天日期,格式:yyyy-mm-dd]」條件,從資料庫查詢前一天的交易時,若交易日期字段格式為「yyyymmdd」,當且僅當跨年後的第一天,能查詢到上一年的全部交易資料。

以上資料庫表中的交易日期欄位中包含了「yyyy-mm-dd」與「yyyymmdd」兩種格式的資料,前一種格式的交易資料可以每天正常生成前一天的交易記錄,後一種格式的交易資料只有在跨年後的第一天能生成前一年全年的交易記錄。

對於資料庫表中的代表交易日期的字段(型別為字串),應當避免同乙個字段包含不同日期格式的資料。假如由於歷史原因,確實包含了不同日期格式的資料,在資料庫語句的條件中,應當指定是否包含「-」,明確查詢的資料格式,避免出現類似的錯誤。

java日期中YYYY與yyyy的區別

我不知道各位小夥伴有沒有在開發中使用過new dateformat yyyy mm dd hh mm ss 在使用的時候發現yyyy與yyyy的效果沒什麼區別,但是其實是有問題的!需求 我想統計一下當前10分鐘內巡河的人員。過程1 於是我單元測試獲取十分鐘前的時間,發現並沒有什麼問題,很開心。tes...

日期格式化yyyy年MM月dd日aHH mm

例1.這裡的時間本身就是錯的,12和24小時混用 所以hh是大寫,如果小寫,就到30號了 dateformat formatter new dateformat yyyy年mm月dd日ahh mm yyyy mm dd hh mm ss system.out.println formatter.pa...

日期的轉換與比較

前不久需要實現這樣乙個小功能,在啟動程式時檢查資料庫裡的日誌是否有超過指定時間 比如說90天 的,如果有則刪除這之前的日誌。該日誌是自己在使用軟體時記錄的一些操作。當時的想法就是獲取現在的日期,獲取資料庫裡日誌的日期。然而資料庫裡的日期卻是用字串儲存的,所以需要進行一些轉換。有好幾種轉換,下面就一一...