Как сравнить DATETIME с датой VARCHAR, которая может иметь разную длину? - PullRequest
1 голос
/ 12 октября 2011

В SQL Server 2008 R2 мне нужно сравнить две даты рождения из разных таблиц.

  • столбец C.date_of_birth имеет тип DATETIME
  • столбец R.dob - это дата, хранящаяся как VARCHAR, но без начальных нулей в частях месяца или дня, чтобы сделать ее длину согласованной (<- это сложная часть). </li>

Я подошел так близко:

where R.dob <> convert(varchar, cast(C.date_of_birth as DATE), 101)

но это возвращает слишком много строк, потому что 1/5/1923 в R.dob не соответствует 01/05/1923 в C.date_of_birth.

Как мне отформатировать R.dob, чтобы его можно было правильно сравнить с C.date_of_birth?

Спасибо.

Ответы [ 4 ]

1 голос
/ 12 октября 2011

Вы можете разыграть своего варчара как дату. Например, результат этого:

select cast('1/5/1923' as datetime)

будет 1923-01-05 00:00:00.000

Тогда вы можете просто использовать DATEDIFF(), чтобы сравнить их, чтобы увидеть, какие дни совпадают (или любой другой интервал, который вы желаете).

0 голосов
/ 12 октября 2011

Как уже говорили другие, первым вариантом будет изменить тип данных с R.Dob на Date.

В противном случае вы должны привести ваш varchar к date, и ваши комментарии приведут к ошибке при этом. Причина этого, вероятно, в том, что в столбце указаны недопустимые даты. Вы можете использовать функцию isdate , чтобы выяснить, какие строки имеют недопустимые даты.

Другая причина может заключаться в том, что ваш SQL Server не знает, как интерпретировать ваши строки дат. Я не знаю, как интерпретировать это значение 1/5/1923, так как SQL Server может знать?

Используйте установить формат даты , чтобы сообщить SQL Server, как интерпретировать строку даты.

set dateformat mdy
select cast('1/5/1923' as date)

set dateformat dmy
select cast('1/5/1923' as date)

Результат:

----------
1923-01-05

----------
1923-05-01
0 голосов
/ 12 октября 2011

Я бы попытался привести поле varchar к настоящему времени и сделать сравнение; например, все эти форматы могут быть легко преобразованы в тип даты:

SELECT cast ( '1/1/2011' as date) col1
union
SELECT cast ( '01/11/2011' as date) col1
union
SELECT cast ( 'Oct 7 2011' as date) col1
union
SELECT cast ( '2011-02-23' as date) col1

Выходы:

col1
----------
2011-01-01
2011-01-11
2011-02-23
2011-10-07

Так что в вашем запросе вы можете сравнить даты с датами.

0 голосов
/ 12 октября 2011

Как насчет этого?

declare @date_of_birth datetime = '1923-01-05',
        @dob varchar(10) = '01/05/1923'

select  @date_of_birth,
        CONVERT(datetime, @dob, 101), -- 101: mm/dd/yyyy
        case    when @date_of_birth = CONVERT(datetime, @dob, 111)
                then 1 else 0
        end result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...