Ошибка после того, как конвертировали тип данных nvarchar в date - SQL Server

Я произвожу перекрещенную таблицу, где я показываю операторов и каждый будний день с количеством tickets, который обслужил в день, в этом случае я создаю функцию, которая получала бы параметр даты и которую вычисляла бы каждый день недели, чтобы так производить мою таблицу.

CREATE PROCEDURE sp_reporteSemana @FECHA DATE
AS
DECLARE @INICIO_SEMANA AS DATE
DECLARE @MARTES AS DATE
DECLARE @MIERCOLES AS DATE
DECLARE @JUEVES AS DATE
DECLARE @VIERNES AS DATE
DECLARE @SABADO AS DATE
DECLARE @FIN_SEMANA AS DATE

SET @INICIO_SEMANA = CAST(DATEADD(wk, DATEDIFF(wk, 0, @FECHA), 0) AS DATE)
SET @MARTES = DATEADD(DAY, 1, @INICIO_SEMANA)
SET @MIERCOLES = DATEADD(DAY, 2, @INICIO_SEMANA)
SET @JUEVES = DATEADD(DAY, 3, @INICIO_SEMANA)
SET @VIERNES = DATEADD(DAY, 4, @INICIO_SEMANA)
SET @SABADO = DATEADD(DAY, 5, @INICIO_SEMANA)
SET @FIN_SEMANA = CAST(DATEADD(wk, DATEDIFF(wk, 0, @FECHA), 6) AS DATE)

SELECT CODIGO
    ,OPERARIO
    ,[@INICIO_SEMANA] AS LUNES
    ,[@MARTES] AS MARTES
    ,[@MIERCOLES] AS MIERCOLES
    ,[@JUEVES] AS JUEVES
    ,[@VIERNES] AS VIERNES
    ,[@SABADO] AS SABADO
    ,[@FIN_SEMANA] AS DOMINGO
FROM (
    SELECT a.OPER_CODIGO CODIGO
        ,a.OPER_NOMBRE + ' ' + a.OPER_APEPATER + ' ' + a.OPER_APEMATER OPERARIO
        ,CAST(c.TCKT_FFINAL AS DATE) FECHAS
        ,COUNT(b.TCKT_NUMERO) CANTIDAD
    FROM OPERARIO a
    INNER JOIN BITACORA b ON a.OPER_CODIGO = b.OPER_CODIGO
    INNER JOIN TICKET c ON b.TCKT_NUMERO = c.TCKT_NUMERO
    WHERE CAST(c.TCKT_FFINAL AS DATE) BETWEEN @INICIO_SEMANA
            AND @FIN_SEMANA
    GROUP BY a.OPER_CODIGO
        ,a.OPER_NOMBRE + ' ' + a.OPER_APEPATER + ' ' + a.OPER_APEMATER
        ,CAST(c.TCKT_FFINAL AS DATE)
    ) z
PIVOT(SUM(CANTIDAD) FOR FECHAS IN (
            [@INICIO_SEMANA]
            ,[@MARTES]
            ,[@MIERCOLES]
            ,[@JUEVES]
            ,[@VIERNES]
            ,[@SABADO]
            ,[@FIN_SEMANA]
            )) AS pvt
ORDER BY pvt.CODIGO ASC
GO

Выполнив мою процедуру, SQL бросает мне следующую ошибку:

Mens 8114, Уровень 16, государство 1, Процедура sp_reporteSemana, Линия 35 Ошибка после того, как конвертировали тип данных nvarchar в date. Mens 473,

Уровень 16, государство 1, Процедура sp_reporteSemana, Линия 35 предоставлял Себе неправильную стоимость "@INICIO_SEMANA" в действующем ЦЕНТРЕ.

Подмостки - следующие

introducir la descripción de la imagen aquí

Где:

  1. TCKT_NUMERO - INT
  2. TCKT_FINAL - DATETIME
  3. OPER_CODIGO INT
  4. Оставшаяся часть явных колонн VARCHAR

Я присоединяю рукописный шрифт:

https://drive.google.com/open? id=0B9bSAuyQqhsic3lZUE1aNlVEcmc

Он немного длинный поэтому я это переслал в мой Drive.

1
задан 11.01.2017, 05:03
0 ответов

Как уже он был прокомментирован, ты не можешь использовать переменные с PIVOT. Но вместо того, чтобы вооружать динамическую консультацию, ты можешь добиваться эквивалента центра используя функцию SUM с условием в дату. Делая это таким образом, ты можешь использовать переменные без проблемы:

CREATE PROCEDURE sp_reporteSemana @FECHA DATE
AS
DECLARE @INICIO_SEMANA AS DATE
DECLARE @MARTES AS DATE
DECLARE @MIERCOLES AS DATE
DECLARE @JUEVES AS DATE
DECLARE @VIERNES AS DATE
DECLARE @SABADO AS DATE
DECLARE @FIN_SEMANA AS DATE

SET @INICIO_SEMANA = CAST(DATEADD(wk, DATEDIFF(wk, 0, @FECHA), 0) AS DATE)
SET @MARTES = DATEADD(DAY, 1, @INICIO_SEMANA)
SET @MIERCOLES = DATEADD(DAY, 2, @INICIO_SEMANA)
SET @JUEVES = DATEADD(DAY, 3, @INICIO_SEMANA)
SET @VIERNES = DATEADD(DAY, 4, @INICIO_SEMANA)
SET @SABADO = DATEADD(DAY, 5, @INICIO_SEMANA)
SET @FIN_SEMANA = CAST(DATEADD(wk, DATEDIFF(wk, 0, @FECHA), 6) AS DATE)

;with cte as (
  SELECT a.OPER_CODIGO CODIGO,
         a.OPER_NOMBRE + ' ' + a.OPER_APEPATER + ' ' + a.OPER_APEMATER OPERARIO,
         CAST(c.TCKT_FFINAL AS DATE) FECHAS,
         COUNT(b.TCKT_NUMERO) CANTIDAD
    FROM OPERARIO a
    JOIN BITACORA b ON a.OPER_CODIGO = b.OPER_CODIGO
    JOIN TICKET c ON b.TCKT_NUMERO = c.TCKT_NUMERO
   WHERE CAST(c.TCKT_FFINAL AS DATE) BETWEEN @INICIO_SEMANA AND @FIN_SEMANA
   GROUP BY a.OPER_CODIGO,
            a.OPER_NOMBRE + ' ' + a.OPER_APEPATER + ' ' + a.OPER_APEMATER,
            CAST(c.TCKT_FFINAL AS DATE)
)
select codigo,
       operario,
       coalesce(sum(case when fechas = @inicio_semana then cantidad end),0) as lunes,
       coalesce(sum(case when fechas = @martes then cantidad end),0) as martes,
       coalesce(sum(case when fechas = @miercoles then cantidad end),0) as miercoles,
       coalesce(sum(case when fechas = @jueves then cantidad end),0) as jueves,
       coalesce(sum(case when fechas = @viernes then cantidad end),0) as viernes,
       coalesce(sum(case when fechas = @sabado then cantidad end),0) as sabado,
       coalesce(sum(case when fechas = @fin_semana then cantidad end),0) as domingo
  from cte
 group by codigo, operario
 order by codigo, operario;
GO

Demo (благодаря @Flxtr из-за того, что перемещает твой рукописный шрифт в rextester!)

1
ответ дан 03.12.2019, 17:46
  • 1
    Одна изумляет RexTester :) я думаю, что твой ответ - má s преуспевшая, что mí во ввиду того, что в результате появляются даты из-за dí в, поэтому я поместил в моем ответе , хотя я не уверен, желанный результат ли это –  11.01.2017, 06:41
  • 2
    @Flxtr: sí. давно, что abandoné в SQLFiddle. Ло ú nico с rextester дело в том, что, в зависимости от базы данных, нужно делать drop объектов вручную (пример: MySQL, Oracle). SQLFiddle лучше для этого. –  11.01.2017, 13:38
  • 3
    Большое спасибо Вам, из-за того, что molestí берется; в, я им очень благодарен, estaré читая có я говорю и функции, которые ты использовал, чтобы мочь изучать (мне не нравится копировать только) :D –  11.01.2017, 17:09

Эта ошибка выходит у тебя благодаря тому, что в одном PIVOTне могут использоваться переменные, следовательно, рекомендует строить динамическую консультацию и позже выполнять ее с sentenca EXEC, для того, чтобы твой Сторед Проседуре не пометил ошибки, будь должен оставаться следующей формы (хотя я не уверен, желанный результат ли это):

ALTER PROCEDURE sp_reporteSemana @FECHA DATE
AS
DECLARE @INICIO_SEMANA AS DATE
DECLARE @MARTES AS DATE
DECLARE @MIERCOLES AS DATE
DECLARE @JUEVES AS DATE
DECLARE @VIERNES AS DATE
DECLARE @SABADO AS DATE
DECLARE @FIN_SEMANA AS DATE

SET @INICIO_SEMANA = CAST(DATEADD(wk, DATEDIFF(wk, 0, @FECHA), 0) AS DATE)
SET @MARTES = DATEADD(DAY, 1, @INICIO_SEMANA)
SET @MIERCOLES = DATEADD(DAY, 2, @INICIO_SEMANA)
SET @JUEVES = DATEADD(DAY, 3, @INICIO_SEMANA)
SET @VIERNES = DATEADD(DAY, 4, @INICIO_SEMANA)
SET @SABADO = DATEADD(DAY, 5, @INICIO_SEMANA)
SET @FIN_SEMANA = CAST(DATEADD(wk, DATEDIFF(wk, 0, @FECHA), 6) AS DATE)

DECLARE @SQL VARCHAR(MAX)

SET @SQL = '
    SELECT CODIGO
        ,OPERARIO
        ,''' + CAST(@INICIO_SEMANA AS VARCHAR(12)) + ''' AS LUNES
        ,''' + CAST(@MARTES AS VARCHAR(12)) + ''' AS MARTES
        ,''' + CAST(@MIERCOLES AS VARCHAR(12)) + ''' AS MIERCOLES
        ,''' + CAST(@JUEVES AS VARCHAR(12)) + ''' AS JUEVES
        ,''' + CAST(@VIERNES AS VARCHAR(12)) + ''' AS VIERNES
        ,''' + CAST(@SABADO AS VARCHAR(12)) + ''' AS SABADO
        ,''' + CAST(@FIN_SEMANA AS VARCHAR(12)) + ''' AS DOMINGO
    FROM (
        SELECT a.OPER_CODIGO CODIGO
            ,a.OPER_NOMBRE + '' '' + a.OPER_APEPATER + '' '' + a.OPER_APEMATER OPERARIO
            ,CAST(c.TCKT_FFINAL AS DATE) FECHAS
            ,COUNT(b.TCKT_NUMERO) CANTIDAD
        FROM OPERARIO a
        INNER JOIN BITACORA b ON a.OPER_CODIGO = b.OPER_CODIGO
        INNER JOIN TICKET c ON b.TCKT_NUMERO = c.TCKT_NUMERO
        WHERE CAST(c.TCKT_FFINAL AS DATE) BETWEEN ''' + CAST(@INICIO_SEMANA AS VARCHAR(12))+ '''
                AND ''' + CAST(@FIN_SEMANA AS VARCHAR(12)) + '''
        GROUP BY a.OPER_CODIGO
            ,a.OPER_NOMBRE + '' '' + a.OPER_APEPATER + '' '' + a.OPER_APEMATER
            ,CAST(c.TCKT_FFINAL AS DATE)
        ) z
    PIVOT(SUM(CANTIDAD) FOR FECHAS IN (
                 [' + CAST(@INICIO_SEMANA AS VARCHAR(12)) + ']
                ,[' + CAST(@MARTES AS VARCHAR(12)) + ']
                ,[' + CAST(@MIERCOLES AS VARCHAR(12)) + ']
                ,[' + CAST(@JUEVES AS VARCHAR(12)) + ']
                ,[' + CAST(@VIERNES AS VARCHAR(12)) + ']
                ,[' + CAST(@SABADO AS VARCHAR(12)) + ']
                ,[' + CAST(@FIN_SEMANA AS VARCHAR(12)) + ']
                )) AS pvt
    ORDER BY pvt.CODIGO ASC
'
EXEC(@SQL)
GO
0
ответ дан 03.12.2019, 17:46

Теги

Похожие вопросы