นั่นเป็นเพียงพฤติกรรมที่บันทึกไว้ ฉันไม่คิดว่าจะมีใครมายุ่งกับการตั้งค่า
ดูลำดับความสำคัญของประเภทข้อมูลใน MSDN
เมื่อโอเปอเรเตอร์รวมสองนิพจน์ของชนิดข้อมูลที่แตกต่างกันกฎสำหรับลำดับความสำคัญของชนิดข้อมูลระบุว่าชนิดข้อมูลที่มีลำดับความสำคัญต่ำกว่าจะถูกแปลงเป็นชนิดข้อมูลที่มีลำดับความสำคัญสูงกว่า
ตามที่ระบุไว้ในความคิดเห็นสตริงว่างจะถูกแปลงเป็น 0 ในประเภทตัวเลขใด ๆ และเป็น 1900-01-01 00: 00: 00.000 เมื่อแปลงเป็นวันที่
แก้ไข: ฉันคิดว่าปัญหาที่แท้จริงของคุณคือการออกแบบของคุณเพื่อให้คุณต้องเข้าร่วมในสาขาของประเภทข้อมูลที่แตกต่างกัน วิธีเดียวที่จะหลีกเลี่ยงปัญหานี้ได้คือการแปลงข้อเข้าร่วมของคุณซึ่งจะส่งผลเสียต่อประสิทธิภาพการค้นหา ปัญหาหลักอาจเกิดจากการออกแบบสคีมา
แก้ไข: มีการอภิปรายจำนวนมากในความคิดเห็นที่ถูกย้ายไปแชท อย่างไรก็ตามมันอาจดูไร้เหตุผลการแปลงสตริงว่างให้เป็นชนิดข้อมูลอื่นจะสร้างค่าตามอำเภอใจ
รหัสนี้:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
สร้างเอาต์พุตนี้:
0
0
1900-01-01
1900-01-01 00:00:00.000
คุณสามารถคาดหวังได้ว่าพฤติกรรมนี้มีความสอดคล้องกันระหว่างประเภทข้อมูลก่อนหน้านี้อื่น ๆ และคาดว่าการแปลง 0 เป็นวันที่จะให้ค่าตามอำเภอใจเท่าเดิม แต่ไม่เกิดขึ้น
SELECT CONVERT(date, 0)
ผลิต
ไม่อนุญาตการแปลงที่ชัดเจนจากประเภทข้อมูลถึงวันที่
เพราะมันไม่ใช่การแปลงที่รองรับ
ในขณะที่
SELECT CONVERT(datetime, 0)
ผลตอบแทน
มกราคม 01 1900 00:00:00
ใช่แล้วมันแปลกและเป็นอิสระ แต่มีการบันทึกและอธิบายได้จริง