Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Membandingkan dengan tanggal di Oracle sql

Masalahnya ada dua. Pertama, tanggal hampir pasti memiliki komponen waktu. to_date('06-MAR-11','DD-MON-YY') setara dengan 2011/03/06 00:00:00 . Jika Anda menggunakan TRUNC() fungsi Anda akan dapat melihat semuanya untuk hari itu:

select * 
  from test_table
 where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');

Saya akan tidak menggunakan model format tanggal waktu MON. Seperti yang saya jelaskan di sini, itu tergantung pada wilayah dan pengaturan Anda. Lebih aman menggunakan model format bulan numerik. Demikian pula, selalu tentukan abad sebagai bagian dari tahun.

where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');

Masalah kedua Anda hampir pasti NLS_DATE_FORMAT Anda; tampaknya tidak memperhitungkan waktu, oleh karena itu mengapa Anda melihat 4 tanggal yang identik. Ini hanya mengatur cara data ditampilkan bukan cara penyimpanannya.

Anda dapat mengubahnya menggunakan sesuatu seperti:

ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"

Jika saya menyiapkan lingkungan pengujian menggunakan yang berikut ini:

create table test_table ( creation_date date );
insert into test_table values ( sysdate );
insert into test_table values ( sysdate - 0.01 );
alter session set nls_date_format = "YYYY/MM/DD";

Anda dapat melihat data yang dikembalikan tidak termasuk waktu (meskipun SYSDATE melakukannya):

SQL> select * from test_table;

CREATION_D
----------
2013/04/12
2013/04/12

Mengubah NLS_DATE_FORMAT dan melakukan SELECT yang sama, Anda sekarang mendapatkan komponen waktu:

SQL> alter session set nls_date_format = "YYYY/MM/DD HH24:MI:SS";

Session altered.

SQL> select * from test_table;

CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17

Terakhir, ketika mencoba memilih tanggal hari ini saja, tidak ada baris yang akan ditampilkan:

SQL> select *
  2    from test_table
  3   where creation_date = to_date('20130412','yyyymmdd');

no rows selected

Tapi, saat menggunakan TRUNC() untuk membandingkan hanya pada bagian tanggal bidang Anda mendapatkan semua baris Anda lagi:

SQL> select *
  2    from test_table
  3   where trunc(creation_date) = to_date('20130412','yyyymmdd');

CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17

Untuk benar-benar menjawab pertanyaan kedua Anda, jika Anda menginginkan tanggal yang unik, Anda dapat menggunakan kembali TRUNC() fungsi:

select distinct trunc(creation_date)
  from test_table


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menghapus semua item yang di-cache di Oracle

  2. Pisahkan String berdasarkan posisi pembatas menggunakan Oracle SQL

  3. Beberapa fungsi REPLACE di Oracle

  4. Mengapa tidak ada output saat blok PLSQL Anonymous selesai?

  5. C#:Kesetaraan Tipe Data Oracle dengan OracleDbType