在透视时从字符串转换日期和/或时间时转换失败

时间:2017-12-25 11:55:04

标签: sql sql-server pivot dynamic-sql

我有以下SQL查询:

DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX),
        @OID AS NVARCHAR(MAX) = '(105, 106)',
        @startDate DATETIME = DATETIMEFROMPARTS(2017, 11, 01, 17, 0, 0, 0),
        @endDate DATETIME =  DATETIMEFROMPARTS(2017, 11, 25, 17, 0, 0, 0)

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(Point) 
                      FROM Value
                      GROUP BY Point
                      ORDER BY Point
                      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SET @query = 'SELECT timestamp,' + @cols + ' from 
         (
            select timestamp, point, valuenumeric
            from value where point in ' + @OID + ' and Timestamp between ' + 
@startDate + ' and ' + @endDate + '
        ) x
        pivot 
        (
            avg(valuenumeric)
            for point in (' + @cols + ')
        ) p '

execute(@query);

但是我收到了这个错误:

  

Msg 241,Level 16,State 1,Line 16
  从字符串转换日期和/或时间时转换失败。

2 个答案:

答案 0 :(得分:2)

问题不在于这些问题,即动态sql部分中您将datetime数据类型@startdate@enddate附加到字符串的问题。它应该是:

....
Timestamp between ''' + 
CONVERT(NVARCHAR(50), @startDate, 121)+ ''' and ''' + CONVERT(NVARCHAR(50),@endDate, 121) + '''
        ) x
...

您还需要添加更多',以便将查询正确组合为动态SQL查询。

所以你的完整查询将是:

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX),
@OID as NVARCHAR(MAX) = '(105, 106)',
@startDate datetime = convert(datetime,'01-11-2017 6:10:00 PM',105),
 @endDate datetime =  convert(datetime,'30-11-2017 6:10:00 PM',105);

select @cols = STUFF((SELECT ',' + QUOTENAME(Point) 
                from Value
                group by Point
                order by Point
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'');

set @query = 'SELECT timestamp,' + @cols + ' from 
         (
            select timestamp, point, valuenumeric
            from value where point in ' + @OID + ' and Timestamp between ''' + 
CONVERT(NVARCHAR(50), @startDate, 121)+ ''' and ''' + CONVERT(NVARCHAR(50),@endDate, 121) + '''
        ) x
        pivot 
        (
            avg(valuenumeric)
            for point in (' + @cols + ')
        ) p ';


 execute(@query);

答案 1 :(得分:1)

在与this.g.nativeElement.click(); // if active tab = 'g', g = group连接之前,您需要明确地将datetime转换为varchar

此外,您还需要在datetime参数周围添加两个单引号,以使用单引号括起日期。

为了避免所有这些麻烦,我建议使用参数化的sql。

string