Конвертация даты

Пусть имеем весьма простенькую таблицу:

create table tbl (d date)

 

В которую положим одну дату:

insert tbl values ('2009-04-01')

select *, cast(d as char(10)) + ' ' + '00:00:00' from tbl

d

---------- -------------------

2009-04-01 2009-04-01 00:00:00

Как вы думаете, почему этот запрос вылетает с ошибкой:

 

select *, cast(cast(d as char(10)) + ' 00:00:00' as datetime) from tbl

Msg 242, Level 16, State 3, Line 1

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

 

в то время, как этот работает нормально:

select *, cast('2009-04-01' + ' 00:00:00' as datetime) from tbl

d

---------- -----------------------

2009-04-01 2009-04-01 00:00:00.000

 

И этот тоже:

 

declare @d date = '2009-04-01'

select *, cast(cast(@d as char(10)) + ' 00:00:00' as datetime) from tbl

d

---------- -----------------------

2009-04-01 2009-04-01 00:00:00.000

 

И даже этот:

 

select top 100 percent *, cast(cast(d as char(10)) + ' 00:00:00' as datetime) from tbl

d

---------- -----------------------

2009-04-01 2009-04-01 00:00:00.000

Дискуссию по этому поводу читайте здесь: https://sqlclub.ru/forum/viewtopic.php?f=4&t=2163