SQL Server Isnull Kembali 1900-01-01 ketika bidang adalah nol

15

Sepotong kode berikut mengembalikan 1900-01-01 ketika bidang DOB adalah nol. Saya ingin (dan berharap) mengembalikan string kosong ('') tetapi tidak. Bagaimana saya melanjutkan untuk mendapatkan hasil yang saya inginkan?

isnull(convert(date,DOB,1),'')
Juan Velez
sumber
5
Anda terlalu banyak mencampur tipe data. Pada dasarnya apa yang Anda lakukan dengan NULLkencan katakan SELECT CAST('' AS DATE). Apa tipe data itu DOB?
Mark Sinkinson
1
ini adalah tipe data varchar yang saya konversi saat ini
Juan Velez
5
Saya tahu ini adalah posting lama tetapi perlu disebutkan bahwa tampaknya Anda mencoba memformat data dalam SQL alih-alih membiarkan lapisan aplikasi melakukannya untuk Anda. 99,9% dari waktu Anda lebih baik membiarkan lapisan aplikasi melakukan pemformatan.
Erik

Jawaban:

20

Anda tidak bisa mendapatkan string kosong karena Anda mengembalikan DATEtipe nilai dari ISNULL.

Per MSDN ,ISNULL

Mengembalikan tipe yang sama dengan check_expression. Jika NULL literal disediakan sebagai check_expression, mengembalikan tipe data dari nilai replacement_value. Jika NULL literal disediakan sebagai check_expression dan tidak ada replacement_value disediakan, mengembalikan int.

Jika Anda memeriksa apakah nilainya atau tidak NULL, tidak perlu mengubahnya menjadi tanggal, kecuali jika Anda ingin mengembalikan nilai tanggal (yang tampaknya tidak Anda lakukan).

Sebaliknya, gunakan:

SELECT ISNULL( DOB , '')

Yang akan kembali

''

jika nilainya NULL.

Sebuah NULLsaat ini adalah NULL(tidak ada nilai). Sebuah string kosong, di sisi lain, mengevaluasi 0, yang dalam SQL Server secara implisit merupakan bilangan bulat yang mewakili jumlah hari sejak itu 1900-01-01.

LowlyDBA
sumber
-3

Jika Anda ingin mengembalikan nilai untuk DOB ketika sudah terisi dan hapus nilai nol ketika tidak ada DOB yang terisi. Anda dapat mencoba ini, tetapi DOB akan menjadi varchar dan bukan tipe tanggal.

isnull(cast(cast(DOB as date)as varchar),'') as DOB   (SQL SERVER)
Elvis Candelaria
sumber
2
Casting VARCHARke DATEdan kembali ke VARCHARtidak masuk akal. Ketika Anda menghapus omong kosong itu, jawaban Anda sama dengan jawaban yang diterima dengan sedikit eksposisi.
Erik
Ya, dalam skenario Anda tidak masuk akal tetapi dalam skenario yang saya gunakan untuk itu, saya mulai dengan datetimetanggal dan hanya perlu tanggal YYYY-MM-DD. Jadi dengan casting saat datesaya menjatuhkan waktu. Kemudian casting varcharmemungkinkan untuk penggunaan isnullfungsi. Jadi saya masih mendapatkan tanggal untuk catatan yang terisi dan menghapus nilai nol. Kalau tidak, aku akan mendapatkannya 1900-01-01 00:00:00.000.
Elvis Candelaria
1
Ini bukan skenario saya, melainkan skenario dari pertanyaan. Saya percaya itu sebabnya Anda mengumpulkan suara. Anda sebenarnya mencoba menjawab pertanyaan yang berbeda.
Erik
Ya kamu benar. Saya salah baca. Salahku.
Elvis Candelaria
-3

Ini akan mengonversi tanggal NULL menjadi spasi. Lapisan aplikasi (Excel) menangani ruang halus

ISNULL (CONVERT(varchar(50), w.TRANSACTIONDT, 120), '')  as wTRANSACTIONDT
SQLjj
sumber
-3

Cukup buat tampilan

CREATE VIEW test_view
SEBAGAI
SELECT kasus ketika tahun (DOB) <= 1900 maka nol DOB lain berakhir sebagai DOB, kadang-kadang, id dari tes;

dan kemudian gunakan tabel itu sebagai gantinya: pilih * dari test_view

pengguna99852
sumber
-5

menggunakan

pilih isnull (Konversi (Varchar (500), Tanggal, 106), '')

bekerja

ramchandra bobhate
sumber
2
Dan mengapa ini ide yang bagus?
dezso
1
Ini pada dasarnya identik dengan jawaban SQLjj .
Andriy M