Я получаю сообщение об ошибке операнда при запуске сценария, совместимого с хранилищем данных - PullRequest
0 голосов
/ 12 июня 2018

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

Ниже приведен мой запрос, который я выполняю на 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);

Ответы [ 2 ]

0 голосов
/ 13 июня 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 );

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

0 голосов
/ 12 июня 2018

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

...