Menggunakan variabel mysql ke dalam pernyataan Java JDBC yang disiapkan

katakanlah saya memiliki pertanyaan berikutnya:

SELECT UNIX_TIMESTAMP(Logins.FechaLogin) FROM GA.Logins WHERE Logins.IdEmpleado = ? AND UNIX_TIMESTAMP(Logins.FechaLogin) >= UNIX_TIMESTAMP(?) AND UNIX_TIMESTAMP(Logins.FechaLogin) <= UNIX_TIMESTAMP(?)

Dan saya ingin sesuatu seperti:

Date = UNIX_TIMESTAMP(Logins.FechaLogin);

SELECT UNIX_TIMESTAMP(Logins.FechaLogin) FROM GA.Logins WHERE Logins.IdEmpleado = ? AND Date >= UNIX_TIMESTAMP(?) AND Date <= UNIX_TIMESTAMP(?)

stmt.setInt(1, EmployeeId);
stmt.setString(2, Date1);
stmt.setString(3, Date2);

Semua ke dalam Pernyataan yang Disiapkan (JDBC prepStatement()), adakah cara saya bisa melakukan hal seperti ini untuk menghindari redundansi ke dalam kueri? atau apakah ini sesuatu yang tidak berguna? omong-omong menurut saya itu harus melewati fungsi UNIX_TIMESTAMP di setiap iterasi SELECT jika saya benar.

Terima kasih!


person Neo    schedule 08.07.2013    source sumber
comment
Apa tipe data kolom FechaLogin? Bukankah d >= t AND d <= t sama dengan d = t ?   -  person spencer7593    schedule 08.07.2013
comment
Panjang sekali, saya tidak menentukan tipe data apa pun karena itu hanya contoh, (saya belum pernah bekerja dengan variabel mysql sebelumnya) tetapi karena saya memformat setiap stempel waktu menjadi waktu unix maka saya menggunakan tipe data long.   -  person Neo    schedule 08.07.2013
comment
Saya melakukan kesalahan dalam memberikan contoh, maaf atas kebingungannya, lihat jawaban saya yang diperbarui, terima kasih atas balasan Anda..   -  person Neo    schedule 08.07.2013
comment
Yang ingin saya lakukan hanyalah memasukkan variabel ke dalam pernyataan yang telah disiapkan dan kemudian menggunakannya dalam kueri, pertanyaan saya adalah, apakah mungkin?   -  person Neo    schedule 08.07.2013


Jawaban (1)


Jawaban singkatnya adalah tidak, Anda tidak bisa mereferensikan variabel MySQL sebagai pengganti referensi kolom, atau sebagai ganti ekspresi yang berisi referensi kolom. Dalam pernyataan yang telah disiapkan, Anda hanya dapat "mengikat" variabel ke nilai; Anda tidak dapat "mengikat" nama tabel atau nama kolom.

(Pembatasan ini ada hubungannya dengan cara pernyataan SQL diproses. Ketika pernyataan SQL "disiapkan", pengoptimal perlu mengetahui semua tabel dan kolom yang direferensikan. Pengoptimal harus memverifikasi bahwa referensi tersebut valid, bahwa pengguna mempunyai hak istimewa pada objek yang direferensikan, ia harus mencari tipe data kolom, memeriksa indeks yang sesuai, dan seterusnya. Masalahnya adalah ia tidak dapat melakukan hal tersebut jika nama kolom tidak ada. Ini menjelaskan mengapa Anda menang' Anda tidak dapat menemukan contoh bagaimana melakukan apa yang ingin Anda lakukan.)

Tentunya, Anda dapat menggunakan variabel Java dan manipulasi string untuk menghasilkan String yang berisi teks SQL yang akan diteruskan ke MySQL. Namun string terakhir yang diteruskan ke MySQL dapat memiliki placeholder, namun string tersebut hanya dapat menjadi placeholder untuk nilai.

Itu seharusnya menjawab pertanyaan Anda.


Ada beberapa catatan lain yang bisa kita buat, mengenai penggunaan fungsi UNIX_TIMESTAMP (apakah itu perlu atau diinginkan), implikasi kinerja dari predikat yang memiliki referensi kolom yang dibungkus dengan fungsi, dll. Tapi itu tidak benar-benar menjawab pertanyaan Anda bertanya .

person spencer7593    schedule 08.07.2013