Я надеюсь, что кто-то может дать мне объяснение следующую проблему, связанную с преобразованием varchar в datetime.SQL - непоследовательная проблема преобразования даты и времени
Код ниже работы:
SELECT
mt.matter_code,
ud.uds_type,
ud.group_no,
ud.ud_field##2,
convert(datetime,ud.ud_field##2,103) hearingDate
FROM dbo.matdb mt
INNER JOIN dbo.matdb_add_in ad
ON mt.mt_int_code = ad.mt_int_code
AND ad.add_in_code = 'OUTAA'
INNER JOIN dbo.uddetail ud
ON convert(varchar,ad.mt_add_in_int_code) = ud.owner_code
AND ud.parent_code = ad.add_in_code
AND ud.po_type_char = 'A'
AND ud.uds_type = 'LPR'
--AND ud.uds_type IN (SELECT s FROM dbo.split(',','LPR'))
WHERE mt.mt_type = 'MATA'
AND mt.matter_code = '118-1'
ORDER BY ud.ud_field##2 ASC;
Однако, если мы подставим
'AND ud.uds_type = 'LPR'
ДЛЯ
'AND ud.uds_type IN (SELECT s FROM dbo.split(',','LPR'))'
Я получаю следующее сообщение об ошибке преобразования: «не удалось преобразования при преобразовании datetime из символьной строки. '
Обе строки кода возвращают ТОЧНЫЕ одинаковые результаты, когда не используются преобразования. Однако, как только будет введено преобразование при использовании dbo.split(), я получаю сообщение об ошибке, упомянутое выше.
Я пропустил какую-то ссылку или это ошибка?
EDIT: функция dbo.split
USE [Vfile_Dev]
GO
/****** Object: UserDefinedFunction [dbo].[Split] Script Date: 02/18/2016 13:28:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[Split] (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
FROM Pieces
)
GO
EDIT: Если кому-то интересно, я обеспечил решение, ниже которого стало возможным благодаря Ивану. Дополнительные проверки были сделаны на ud.ud_field ## 2, чтобы убедиться, что не было пробелов, и результаты dbo.split теперь вставляются в переменную таблицы.
INSERT INTO @screenTable
SELECT s FROM dbo.split(',','LPR,COU');
SELECT
mt.matter_code,
ud.uds_type,
ud.group_no,
isnull(nullif(ud.ud_field##2,''),'01/01/1990') as hdNorm,
convert(datetime, isnull(nullif(ud.ud_field##2,''),'1990-01-01 00:00:00.000')) AS hdConverted
FROM dbo.matdb mt
INNER JOIN dbo.matdb_add_in ad
ON mt.mt_int_code = ad.mt_int_code
AND ad.add_in_code = 'OUTAA'
INNER JOIN dbo.uddetail ud
ON convert(varchar, ad.mt_add_in_int_code) = ud.owner_code
AND ud.parent_code = ad.add_in_code
AND ud.uds_type IN (select * from @screenTable)
WHERE mt.mt_type = 'MATA'
AND mt.matter_code = '118-1'
ORDER BY group_no ASC;
Как насчет совместного использования функции разделения? –
Просьба привести минимальный пример, демонстрирующий вашу проблему. http://stackoverflow.com/help/how-to-ask –
У вас есть недопустимые данные в таблице, которые не соответствуют вашим критериям поиска? В зависимости от случая, которое вы можете читать +, конвертируя также те строки, которые будут удалены позже, но затем произойдет ошибка. –