У меня есть два поля даты, к которым мне нужно присоединиться.
Первый - это обычное время в формате yyyy-mm-dd hh:mm:ss
Второй - это varchar (8) в дочернем формате рыжего шага mmddyyyy
Теперь это становится болезненным, потому что нет простого способа преобразования в соответствующий тип. Существует встроенный формат yyyymmdd
, но он не соответствует формату varchar.
Я вижу два пути:
declare @normal_date as datetime;
declare @hated_date as varchar(8);
set @normal_date='1974-11-01 00:00:00.000'
set @hated_date='11011974'
--cast to date time with string splits
select @normal_date
where CONVERT(datetime, RIGHT(@hated_date,4)+LEFT(@hated_date,2)+SUBSTRING(@hated_date,3,2))=@normal_date
--convert normal date to ackward format
select @normal_date
where REPLACE(CONVERT(varchar(10),@normal_date,101), '/','')=@hated_date
Что лучше? Или есть лучший способ?
Отредактировано, чтобы показать расходы
--Operator cost (39%)
CONVERT(datetime, RIGHT(@hated_date,4)+LEFT(@hated_date,2)+SUBSTRING(@hated_date,3,2))=@normal_date
--Operator cost (57%)
REPLACE(CONVERT(varchar(10),@normal_date,101), '/','')=@hated_date
--Operator cost (46%)
cast(stuff(stuff(@hated_date, 3,0, '/'),6,0,'/') as datetime)=@normal_date
--Operator cost (47%)
RIGHT(@hated_date, 4) + LEFT(@hated_date, 4)=@normal_date