Как решить «Преобразование не удалось при преобразовании даты и / или времени из символьной строки» в моем случае в SQL Server - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь сделать динамический запрос, используя дату, я не знаю, что не так

Фактические данные поля времени из таблицы SALES

Department  Time        ExtendedPrice
-------------------------------------
Toys        2018-11-01      1205.11
Toys        2018-12-02      1230.27
Baby Care   2018-12-01      6797.95
Sports      2019-01-01      365.8
Sports      2019-01-01      2993.44
Sports      2018-12-02      580.03
Baby Care   2019-01-02      1117.92
Baby Care   2019-01-02      390.75
soap        2018-11-01      3275.25
Baby Care   2018-12-01      367.56

указанная выше дата является примером формата фактических данных

DECLARE @cols AS Varchar(MAX)
select @cols = STUFF((SELECT ',' + convert(varchar(MAX),Time,105)+''
                      FROM #Sales
                      GROUP by Time
                      ORDER by Time

               FOR XML PATH(''), TYPE
               ).value('.', 'VARCHAR(MAX)') 
               ,1,1,'')

Выход

select @cols
//output
01-11-2018,02-11-2018,01-12-2018,02-12-2018,01-01-2019,02-01-2019

@ запрос

DECLARE @query AS Varchar(MAX)
SET @query = 'SELECT 
                    ' + @cols + '
              FROM 
              (
                   SELECT 
                       convert(varchar(MAX),Time,105) Time,
                       ExtendedPrice
                   FROM 
                       #Sales
              ) x
              pivot 
              (
                  sum(ExtendedPrice)
                  for Time in (' + @cols + ')
              ) p '
PRINT @query

показывает ошибку после ошибки

Ошибка преобразования при преобразовании даты и / или времени из символьной строки.

UPDATE

Я пробовал также это

DECLARE @cols AS Varchar(MAX)
SELECT @cols = STUFF((SELECT ',[' + convert(varchar(MAX),Time,105)+']'
                FROM #Sales
                GROUP by Time
                ORDER by Time
        FOR XML PATH(''), TYPE
        ).value('.', 'VARCHAR(MAX)') 
    ,1,1,'')

    select @cols

//output
[01-11-2018],[02-11-2018],[01-12-2018],[02-12-2018],[01-01-2019],[02-01-2019]

1 Ответ

2 голосов
/ 28 марта 2019

Вы должны указать даты как

CREATE TABLE T
    ([Department] varchar(9), [Time] datetime, [ExtendedPrice] int)
;

INSERT INTO T
    ([Department], [Time], [ExtendedPrice])
VALUES
    ('Toys', '2018-11-01 00:00:00', 1205.11),
    ('Toys', '2018-12-02 00:00:00', 1230.27),
    ('Baby Care', '2018-12-01 00:00:00', 6797.95),
    ('Sports', '2019-01-01 00:00:00', 365.8),
    ('Sports', '2019-01-01 00:00:00', 2993.44),
    ('Sports', '2018-12-02 00:00:00', 580.03),
    ('Baby Care', '2019-01-02 00:00:00', 1117.92),
    ('Baby Care', '2019-01-02 00:00:00', 390.75),
    ('soap', '2018-11-01 00:00:00', 3275.25),
    ('Baby Care', '2018-12-01 00:00:00', 367.56)
;

DECLARE @cols AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME(CONVERT(VARCHAR(10), Time, 105))
                      FROM T
                      GROUP by Time
                      ORDER by Time
               FOR XML PATH(''), TYPE
               ).value('.', 'VARCHAR(MAX)') 
               ,1,1,'');

DECLARE @query AS NVARCHAR(MAX)=
             N'SELECT 
                    ' + @cols + '
              FROM 
              (
                   SELECT 
                       convert(varchar(10),Time,105) Time,
                       ExtendedPrice
                   FROM 
                       T
              ) x
              pivot 
              (
                  sum(ExtendedPrice)
                  for Time in (' + @cols + ')
              ) p ';

EXEC sp_executesql @query;

Возвраты:

+------------+------------+------------+------------+------------+
| 01-11-2018 | 01-12-2018 | 02-12-2018 | 01-01-2019 | 02-01-2019 |
+------------+------------+------------+------------+------------+
|       4480 |       7164 |       1810 |       3358 |       1507 |
+------------+------------+------------+------------+------------+

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...