Pertanyaan Bagaimana cara menyimpan perkiraan tanggal di MySQL?


Saya perlu menyimpan tanggal seperti 'Summer 1878' atau 'Awal Juni 1923', atau bahkan 'Mid-sore pada hari Selasa di bulan Agustus'. Bagaimana Anda menyarankan saya melakukan ini?

Saya telah mempertimbangkan untuk memecah tanggal dan waktu menjadi kolom-kolom terpisah (integer), dan memberikan masing-masing kolom sebuah kolom tambahan (integer) yang berisi suatu kisaran (0 jika tepat; NULL jika tidak diketahui). Tapi aku yakin ada cara lain ...

Terima kasih!


4
2018-05-04 00:47


asal


Jawaban:


Saya menggunakan Postgres, dan saya ingin melakukan hal yang sama. Mungkin Anda dapat melakukannya dengan cara yang sama seperti yang saya lakukan, jika MySQL memiliki beberapa tipe geometrik yang serupa: http://www.electricwords.org/2008/11/fuzzy-date-matching-in-postgresql/


3
2018-05-04 00:57



Hampir tidak peduli apa yang Anda lakukan, Anda hampir pasti tidak akan bisa mendapatkan database untuk melakukan angkat berat untuk Anda. Jadi Anda pergi dengan dua opsi:    1 - Gunakan string alami seperti yang Anda gambarkan    2 - Menyimpan data yang akurat serta ketepatan tanggal tersebut

Misalnya, Anda dapat menyimpan "5:10:23 sore pada 23 September 19775", "plus atau minus 6 bulan", dan ketika seseorang ingin mencari rekaman yang terjadi dalam jangka waktu itu, ini bisa muncul.

Ini tidak membantu dengan pertanyaan, karena sepengetahuan saya, MySQL tidak memberikan dukungan untuk toleransi (tidak juga orang lain yang saya tahu). Anda harus menanyakan semuanya dan kemudian menyaring sendiri.


3
2018-05-04 01:10



Sejak 'Pertengahan sore pada hari Selasa di bulan Agustus' ("Sore Hari Minggu di Pulau La Grande Jatte"?) Tidak menyebutkan satu tahun, satu-satunya solusi nyata adalah tabel semua komponen tanggal dan waktu, semuanya dapat dibatalkan.

Selain itu, Anda meng-conflating data Anda.

Anda memiliki dua hal (yang diakui terkait) di sini: string yang dapat dibaca manusia, tanggal_deskripsi, dan berbagai tanggal yang mungkin.

Jika Anda dapat menentukan setidaknya rentang, Anda dapat melakukan ini:

create table artwork {
  artwork_id int not null primary key,
  name varchar(80),
  ... other columns
  date_description varchar(80),
  earliest_possible_creation_date datetime
  latest_possible_creation_date datetime
}

insert into artwork( 
  name, 
  date_description, 
  earliest_possible_creation_date, 
  latest_possible_creation_date
) values ( 

  'A Sunday Afternoon on the Island of La Grande Jatte',
  'Mid-afternoon on a Tuesday in August'
  '1884-01-01',
  '1886-12-31'
), (
  'Blonde Woman with Bare Breasts',
  'Summer 1878'
  '1878-05-01',
  '1878-08-31'
), (
   'Paulo on a Donkey',
   'Early June 1923',
   '1923-06-01'
   '1923-06-15'
);

Ini memungkinkan Anda untuk menampilkan apa pun yang Anda inginkan, dan mencari:

select * from artwork 
where @some_date between 
earliest_possible_creation_date and latest_possible_creation_date;

Dan jelas, "tanggal pembuatan" (tanggal pembuatan karya itu) sepenuhnya berbeda dari "tanggal yang digambarkan dalam pekerjaan", jika yang terakhir dapat ditentukan sama sekali.


2
2018-05-04 01:43



Saya tidak berpikir setiap representasi tanggal asli MySQL akan bekerja untuk Anda. Solusi dua kolom Anda akan bekerja dengan baik jika dipasangkan dengan stempel waktu Unix (dihasilkan dengan UNIX_TIMESTAMP() berfungsi dengan tanggal MySQL sebagai argumen). Gunakan kolom kedua (lebar rentang) untuk batas atas dan bawah dalam pilihan Anda, dan pastikan kolom tanggal diindeks.


1
2018-05-04 01:45



buat tabel dengan daftar nilai yang Anda inginkan, seperti "Awal" atau "Musim Panas". maka apa pun yang Anda telah mengatur data bisa memiliki algoritma yang menetapkan kunci asing tergantung pada tanggal.


0
2018-05-04 01:14



Pergi dengan jawaban Chris Arguin, di kolom kedua hanya memiliki kolom datetime lain yang dapat Anda gunakan untuk menyimpan +/-, maka Anda harus dapat menulis query yang menggunakan kedua kolom untuk mendapatkan perkiraan datetime.


0
2018-05-04 01:20



Gunakan dua tanggal dan tentukan tanggal mulai dan akhir dari wilayah fuzzy. Untuk hal-hal seperti Summer 1878, masukkan 18780621 ke 18780920. Untuk Awal Juni 1923 Anda harus memutuskan kapan awal berakhir, mungkin 19230601 hingga 19230610. Ini memungkinkan untuk memilih terhadap nilai-nilai. Anda mungkin masih ingin memfilter setelahnya tetapi ini akan membuat Anda dekat.

Untuk yang tanpa tahun, Anda harus menemukan sistem yang berbeda.


0
2018-05-04 01:20



Pada akhirnya saya memutuskan: kolom untuk masing-masing komponen tanggal (tahun, bulan, hari, jam, menit, detik), dan kolom yang menyertainya untuk kisaran masing-masing ini (rentang_bulan, rentang_bulan, rentang_hari, rentang_jeda, durasi_rentang, second_range), terutama karena metode ini memungkinkan saya untuk menentukan yang saya ketahui yakin bahwa foto tertentu diambil pada bulan Agustus (misalnya) di akhir tahun 60-an (tahun = 1868, year_range = 2, bulan = 8, month_range = 0).

Terima kasih atas bantuannya!


0
2018-06-25 07:56