Это небольшое улучшение в ответе Луиса с точки зрения SQL:
SELECT ur.[user_id], ur.record_id,
MAX(CASE WHEN SUH.field_id = 4782 THEN TRY_CONVERT( DATE, SUH.value, 103) END) AS onSale,
MAX(CASE WHEN SUH.field_id = 4783 THEN TRY_CONVERT( DATE, SUH.value, 103) END) AS OffSale
FROM UPLOADS.RECORDS UR LEFT JOIN
UPLOADS.LINES AS SUH
ON SUH.record_id = UR.record_id AND
SUH.field_id IN (4782, 4783)
WHERE ur.module_id = 18
GROUP BY ur.[user_id], ur.record_id;
Тем не менее, ваша проблема в том, что ваши данные не в том формате, в котором вы их считаете.Отсюда и проблема с преобразованием типов.Как говорит @marc_s в комментарии, вы должны использовать нативные и соответствующие типы SQL, которые в данном случае DATE
.И, конечно же, вам не следует использовать устаревшие типы, такие как TEXT
(если только вы на самом деле не имеете в виду VARCHAR()
и не понимаете, что существует устаревший тип TEXT
).Если вы храните значения в строках (поскольку существуют разные типы), вам следует использовать стандартный формат, ГГГГММДД или ГГГГ-ММ-ДД.
Эти значения можно найти, выполнив:
select suh.value
from uploads.lines suh
where suh.field_id in (4782, 4783) and
try_convert(date, suh.value, 103) is null and
suh.value is not null;
Это может помочь вам исправить ваши данные.
После того, как вы исправили свои данные, вы также можете исправить тип:
update uploads.lines
set suh.value = convert(varchar(255), convert(date, suh.value, 103), 112); -- this will convert the value to the default date format