Máy chủ SQL không quay trở lại 1900-01-01 khi trường không có giá trị


14

Đoạn mã sau sẽ trả về 1900-01-01 khi trường DOB là null. Tôi muốn (và dự kiến) nó trả về một chuỗi trống ('') nhưng không được. Làm thế nào tôi nên tiến hành để có được kết quả mong muốn của tôi?

isnull(convert(date,DOB,1),'')

5
Bạn đang trộn các loại dữ liệu quá nhiều. Về cơ bản những gì bạn đang làm với NULLngày đang nói SELECT CAST('' AS DATE). Kiểu dữ liệu là DOBgì?
Mark Sinkinson

1
đó là kiểu dữ liệu varchar mà tôi đang chuyển đổi cho đến nay
Juan Velez

5
Tôi biết đây là một bài viết cũ nhưng điều đáng nói là nó xuất hiện như thể bạn đang cố định dạng dữ liệu trong SQL thay vì để lớp ứng dụng làm điều đó cho bạn. 99,9% thời gian bạn nên để lớp ứng dụng thực hiện định dạng.
Erik

Câu trả lời:


19

Bạn không thể nhận được một chuỗi trống vì bạn đang trả về DATEloại giá trị từ đó ISNULL.

Mỗi MSDN ,ISNULL

Trả về cùng loại với check_expression. Nếu một NULL bằng chữ được cung cấp dưới dạng check_expression, trả về kiểu dữ liệu của thay thế_value. Nếu một NULL theo nghĩa đen được cung cấp dưới dạng check_expression và không có thay thế_value nào được cung cấp, trả về một int.

Nếu bạn đang kiểm tra xem giá trị NULLđó có phải hay không , thì không cần phải chuyển đổi nó thành một ngày, trừ khi bạn muốn trả về giá trị ngày (mà bạn dường như không).

Thay vào đó, sử dụng:

SELECT ISNULL( DOB , '')

Cái nào sẽ trở lại

''

nếu giá trị là NULL.

Một NULLngày là NULL(không có giá trị). Mặt khác, một chuỗi rỗng ước tính 0, trong SQL Server hoàn toàn là một số nguyên biểu thị số ngày kể từ đó 1900-01-01.


-3

Nếu bạn đang tìm cách trả về một giá trị cho DOB ​​khi nó được điền và xóa giá trị null khi không có DOB được điền. Bạn có thể thử điều này nhưng DOB sẽ là một varchar chứ không phải là một loại ngày.

isnull(cast(cast(DOB as date)as varchar),'') as DOB   (SQL SERVER)

2
Đúc một và VARCHARmột DATEtrở lại VARCHARkhông có ý nghĩa gì. Khi bạn loại bỏ điều vô nghĩa đó, câu trả lời của bạn giống như câu trả lời được chấp nhận với ít giải trình hơn.
Erik

Vâng, trong kịch bản của bạn sẽ không có ý nghĩa nhưng trong kịch bản mà tôi đã sử dụng nó, tôi đã bắt đầu với một ngày datetimevà chỉ cần ngày YYYY-MM-DD. Vì vậy, bằng cách đúc khi datetôi thả thời gian. Sau đó đúc varcharcho phép sử dụng isnullchức năng. Vì vậy, tôi vẫn nhận được một ngày cho các bản ghi dân cư và loại bỏ các giá trị null. Nếu không, tôi đã nhận được 1900-01-01 00:00:00.000.
Elvis Candelaria

1
Đó không phải là kịch bản của tôi, đó là kịch bản của câu hỏi. Tôi tin rằng đó là lý do tại sao bạn thu thập phiếu bầu. Bạn đang có hiệu lực đang cố gắng trả lời một câu hỏi khác.
Erik

Vâng, bạn đúng. Tôi đọc nhầm. Lỗi của tôi.
Elvis Candelaria

-3

Điều này sẽ chuyển đổi ngày NULL thành không gian. Lớp ứng dụng (Excel) xử lý không gian tốt

ISNULL (CONVERT(varchar(50), w.TRANSACTIONDT, 120), '')  as wTRANSACTIONDT

-3

Chỉ cần tạo một cái nhìn

TẠO VIEW test_view
NHƯ
trường hợp CHỌN khi năm (DOB) <= 1900 sau đó null DOB khác kết thúc dưới dạng DOB, đôi khi, id từ kiểm tra;

và sau đó sử dụng nó thay vì bảng gốc: chọn * từ test_view


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.