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

Bagaimana cara mendapatkan stempel waktu ini dalam format yang saya inginkan, Oracle SQL

Seperti yang dikatakan @Gordon, cap waktu (dan tanggal) tidak disimpan dalam format yang Anda kenali Oracle menggunakan representasi internal yang tidak perlu Anda ketahui atau periksa (tetapi didokumentasikan jika Anda tertarik pada hal semacam itu) .

Saat Anda meminta stempel waktu, itu ditampilkan menggunakan pengaturan NLS klien Anda, kecuali Anda memiliki klien yang menimpanya. Saya dapat mengatur sesi saya agar sesuai dengan apa yang Anda lihat:

alter session set nls_timestamp_format = 'DD-MON-RR HH.MI.SS.FF AM';

select to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_CHAR(SYSTIMESTAM
-------------------
2018-07-10 15:37:31

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHAR(SYSTIMESTA
-------------------------------
10-JUL-18 03.37.31.000000000 PM

Dan saya dapat mengubahnya untuk melihat apa yang ingin Anda lihat:

alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS';

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHA
-------------------
2018-07-10 15:37:32

Tetapi yang Anda lakukan hanyalah mengonversi dari stempel waktu dengan zona waktu (yang merupakan systimestamp is) ke string dan kemudian kembali ke stempel waktu. Anda kehilangan bagian zona waktu, dan pecahan detik; yang juga dapat Anda lakukan dengan cast :

select cast(systimestamp as timestamp(0)) from dual;

CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32

Anda dapat melihat zona waktu dan pecahan detik dengan timestamp_tz default Anda format:

select systimestamp from dual;

SYSTIMESTAMP                        
------------------------------------
2018-07-10 15:37:33.776469000 +01:00

dan ubah dengan alter yang berbeda :

alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM';

select systimestamp from dual;

SYSTIMESTAMP                  
------------------------------
2018-07-10 15:37:34.070 +01:00

Yang tidak sepenuhnya relevan jika Anda benar-benar berbicara tentang menyimpan stempel waktu dalam tabel, tetapi menunjukkan bahwa ada variasi.

Di tabel Anda buat tipe data timestamp (atau timestamp with time zone atau timestamp with local time zone ), dan hanya khawatir tentang memformat nilai sebagai string untuk presentasi kepada pengguna akhir, pada saat-saat terakhir yang memungkinkan.

Saat Anda perlu menampilkannya, jika format tampilan penting bagi Anda, gunakan to_char() dengan topeng format eksplisit - jangan berasumsi bahwa orang lain yang menjalankan kueri Anda akan memiliki pengaturan NLS yang sama. Seperti yang Anda lihat, mudah untuk mengubahnya untuk memodifikasi output. (Sebagian besar klien memiliki cara untuk membiarkan Anda mengatur default sehingga Anda tidak perlu melakukan alter yang sama perintah setiap kali Anda terhubung; misalnya di SQL Developer, dari Tools->Preferences->Database->NLS). Jika Anda ingin selalu menampilkan format yang sama, gunakan sesuatu seperti:

select to_char(your_column, 'YYYY-MM-DD HH24:MI:SS') as column_alias
from your_table
where your_column < timestamp '2018-01-01 00:00:00'

yang juga menunjukkan nilai kolom yang difilter (sebagai stempel waktu) menggunakan literal stempel waktu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana mengukur kinerja kueri di Oracle

  2. Mencocokkan dua kolom

  3. Bagaimana mengubah Port Web di EBS 12.2

  4. buat kolom id berdasarkan data aktivitas

  5. Dapper - panggil Oracle schema.package.function