sql >> データベース >  >> RDS >> Mysql

非常に古い日付をデータベースに保存する方法は?

    実際、できます ドキュメント にも関わらずMySQLに1000年未満の日付を保存する 明確化:

    mysql> describe test;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | id    | int(11) | YES  |     | NULL    |       |
    | birth | date    | YES  |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    

    -YYYY形式で年を入力する必要があります:

    mysql> insert into test values (1, '0995-03-05');
    Query OK, 1 row affected (0.02 sec)
    
    mysql> select * from test;
    +------+------------+
    | id   | birth      |
    +------+------------+
    |    1 | 0995-03-05 |
    +------+------------+
    1 row in set (0.00 sec)
    

    -これを日付として操作できるようになります :

    mysql> select birth + interval 5 day from test;                                                                              
    +------------------------+                                                                                                   
    | birth + interval 5 day |                                                                                                   
    +------------------------+                                                                                                   
    | 0995-03-10             |
    +------------------------+
    1 row in set (0.03 sec)
    

    安全性も。これがMySQL5.xで機能しないというケースに直面したことはありません(これは、100%機能するという意味ではありませんが、少なくとも一定の確率で信頼できるという意味です)

    紀元前の日付について(キリストの下)。それは簡単だと思います-MySQLには方法はありません 負の日付も保存します。つまり年を符号付き整数フィールドとして個別に格納する必要があります:

    mysql> select '0001-05-04' - interval 1 year as above_bc, '0001-05-04' - interval 2 year as below_bc;
    +------------+----------+
    | above_bc   | below_bc |
    +------------+----------+
    | 0000-05-04 | NULL     |
    +------------+----------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> show warnings;
    +---------+------+--------------------------------------------+
    | Level   | Code | Message                                    |
    +---------+------+--------------------------------------------+
    | Warning | 1441 | Datetime function: datetime field overflow |
    +---------+------+--------------------------------------------+
    1 row in set (0.00 sec)
    

    しかし、いずれの場合も(0年より下/上)、その場合は日付部分を整数として格納する方がよいと思います。これは、文書化されていない機能に依存しません。ただし、日付としてではなく、これら3つのフィールドを操作する必要があります(したがって、ある意味では、問題の解決策ではありません)



    1. 出席データベースの優れたデータベース設計(スキーマ)とは何ですか?

    2. MySQLクエリをスケジュールする方法は?

    3. PostgreSQLのタイムスタンプから日付(yyyy / mm / dd)を抽出します

    4. pg_trgmを使用したPostgresの類似関数