Pertama, di MySQL tanggal biasanya memiliki format berikut ketika dikonversi secara implisit - 2015-01-16
- daripada 20150116
. Saya pikir Anda dapat melakukan hal berikut di MySQL dan Oracle (ini adalah SQL standar) - Saya telah memeriksanya di Oracle (10g) dan berfungsi, dan tampaknya berfungsi dalam mengutak-atik MySQL
:
SELECT * FROM mytable
WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );
String literal yang akan dikonversi ke DATE harus dalam bentuk yyyy-mm-dd
. Sekarang ini akan berfungsi jika tanggal Anda tanggal dan tidak memiliki porsi waktu. Sekarang jika tanggal Anda memiliki porsi waktu, maka segalanya menjadi lebih sulit karena MySQL menggunakan DATE()
berfungsi untuk mendapatkan bagian tanggal, sedangkan Oracle akan menggunakan TRUNC()
. Tapi Anda bisa menyiasatinya dengan penggunaan >=
. yang bijaksana dan <
, misalnya:
SELECT * FROM mytable
WHERE ( mydate >= DATE '2015-01-16' AND mydate < DATE '2015-01-17' )
OR ( mydate >= DATE '2015-01-18' AND mydate < DATE '2015-01-19' );
Sekarang jika Anda ingin menggunakan SYSDATE
, hal terbaik yang harus dilakukan adalah menggunakan CURRENT_DATE
standar ANSI atau CURRENT_TIMESTAMP
. Ini dapat dibandingkan secara langsung tanpa perlu memformat dan harus bekerja di MySQL dan Oracle. Anda juga dapat melakukan aritmatika tanggal menggunakan INTERVAL
, dalam hal ini Anda dapat mencoba hal berikut:
SELECT * FROM mytable
WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;
PERBARUI Saya telah melakukan beberapa pemikiran tentang ini. Kueri tepat di atas tidak benar-benar berfungsi jika Anda ingin mendapatkan semua baris yang telah dimasukkan hari ini . Kesulitannya adalah Oracle mengenali literal tanggal ANSI sebagai tanggal (yaitu, tanpa porsi waktu), tetapi sejauh yang saya tahu, tidak ada cara standar ANSI untuk mengonversi tanggal/waktu nilai (yang merupakan DATE
Oracle Oracle adalah) ke tanggal . Karena itu, Oracle dan MySQL mendukung fungsi EXTRACT(), jadi Anda harus dapat melakukan hal berikut untuk mendapatkan hari ini catatan:
SELECT * FROM mytable
WHERE EXTRACT(YEAR FROM mydate) = EXTRACT(YEAR FROM CURRENT_DATE)
AND EXTRACT(MONTH FROM mydate) = EXTRACT(MONTH FROM CURRENT_DATE)
AND EXTRACT(DAY FROM mydate) = EXTRACT(DAY FROM CURRENT_DATE);
Pasti berat, terutama jika seseorang memiliki lebih dari satu tanggal untuk dipertimbangkan (yang saya asumsikan Anda lakukan karena Anda menggunakan IN
operator), tetapi harus bekerja pada kedua platform. Lihat Demo SQL Fiddle di sini (MySQL)
dan di sini (Oracle)
.