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

Привет, я получаю сообщение об ошибке: Конфликт типов операндов: дата несовместима с целым числом.

Ниже приведен мой запрос, который я запускаю на SQL Server:

CREATE TABLE val.census_last_month
WITH(
    DISTRIBUTION = ROUND_ROBIN
,   CLUSTERED COLUMNSTORE INDEX
)
 AS
  SELECT
    dt_mydate                                                                       AS dt_census,
    (SELECT count(DISTINCT encounter_id)
     FROM prod.encounter
     WHERE encounter_type = 'Inpatient' AND (ts_admit BETWEEN dt_mydate - 30 AND dt_mydate) AND
           (ts_discharge IS NULL OR ts_discharge > dt_mydate))                      AS census,
    (SELECT count(DISTINCT encounter_id)
     FROM prod.encounter
     WHERE encounter_type = 'Inpatient' AND cast(ts_admit AS DATE) = dt_mydate)     AS admits,
    (SELECT count(DISTINCT encounter_id)
     FROM prod.encounter
     WHERE encounter_type = 'Inpatient' AND cast(ts_discharge AS DATE) = dt_mydate) AS discharges
  FROM ref.calendar_day
  WHERE ref.calendar_day.dt_mydate BETWEEN (cast(getdate() as date) - 30) AND cast(getdate() as date);

person Dead Man    schedule 12.06.2018    source источник


Ответы (2)


Вам нужно использовать функцию dateadd. Подробнее см. здесь. https://docs.microsoft.com/en-us/sql/t-sql/functions/dateadd-transact-sql?view=sql-server-2017

person Murshed_MSFT    schedule 12.06.2018

Есть несколько проблем с этим скриптом, однако можете ли вы подтвердить, что типы данных, начинающиеся с «ts_», являются датами, хранящимися как целые числа в формате yyyyMMdd, а типы данных, начинающиеся с «dt_», являются DATE?

Основываясь на этих предположениях, это моя попытка переписать:

SELECT dt_mydate AS dt_census,
    (
    SELECT COUNT( DISTINCT encounter_id )
    FROM prod.encounter
    WHERE encounter_type = 'Inpatient' AND ( CAST( CAST( ts_admit AS CHAR(8) ) AS DATE ) BETWEEN DATEADD( day, -30, dt_mydate ) AND dt_mydate )
    AND ( ts_discharge IS NULL OR CAST( CAST( ts_discharge AS CHAR(8) ) AS DATE ) > dt_mydate)
    ) AS census,
    (
    SELECT COUNT( DISTINCT encounter_id )
    FROM prod.encounter
    WHERE encounter_type = 'Inpatient' AND CAST( CAST( ts_admit AS CHAR(8) ) AS DATE ) = dt_mydate
    ) AS admits,
    (
    SELECT COUNT( DISTINCT encounter_id )
    FROM prod.encounter
    WHERE encounter_type = 'Inpatient' 
    AND CAST( CAST( ts_discharge AS CHAR(8) ) AS DATE ) = dt_mydate
    ) AS discharges
FROM ref.calendar_day
WHERE ref.calendar_day.dt_mydate BETWEEN CAST ( DATEADD( day, -30, GETDATE() ) AS DATE ) AND CAST( GETDATE() AS DATE );

Если какое-либо из моих предположений неверно, сообщите мне, и я обновлю сценарий.

person wBob    schedule 13.06.2018