在TO_DATE函数中使用变量

时间:2019-04-01 09:26:41

标签: sql-server oracle11g linked-server openquery

我正在尝试使用where子句中的今天的日期通过LINKED SERVER从ORACLE返回数据

代码:

let buffer = [];
// Folder of the dataset.
const rootFolder = './dataset'
console.log("Entering in folder dataset");
fs.readdirSync(rootFolder);
// For each folders
const files = fs.readdirSync(rootFolder).map(dirName => {
  if(fs.lstatSync(path.join(rootFolder, dirName)).isDirectory()){
    console.log(`Entering in folder ${path.join(rootFolder, dirName)}`);
    // For each files
    fs.readdirSync(path.join(rootFolder, dirName)).map(picture => {
      if(fs.lstatSync(path.join(rootFolder, dirName, picture)).isFile()){
        if(picture.startsWith("norm")){
          return fileToTensor(path.join(rootFolder, dirName, picture)).then((img) => {
            buffer.push(img);
          }).catch((error) => {console.log(error)});
        }
      }
    });
  }
});

Promise.all(files);
console.log(buffer);

async function fileToTensor(path) {
  return await sharp(path)
  .removeAlpha()
  .raw()
  .toBuffer({ resolveWithObject: true });
}

上面的代码可以正常工作并返回值

有没有一种方法可以使用我的Variable @var_date而不是在我需要/想要的日期进行硬拷贝。

我尝试使用以下内容,但使用代码时出现错误:

  1. WHERE OPICS.FXDH.DEALDATE = TO_DATE(@var_date,``YYYY-MM-DD'')
  2. WHERE OPICS.FXDH.DEALDATE = CONVERT(DATETIME,@var_date,120)

1 个答案:

答案 0 :(得分:2)

正如我在评论中提到的那样,您将需要使用动态sql。 OPENQUERY仅接受文字字符串。

因此,您需要执行以下操作:

DECLARE @var_date date = GETDATE(); --Note the datatype change

DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT TOP(25) * FROM OPENQUERY (OPICS, ''SELECT CASE
            WHEN OPICS.FXDH.BR = 10 THEN ''Botswana''
            WHEN OPICS.FXDH.BR = 20 THEN ''Mozanmbique''
            WHEN OPICS.FXDH.BR = 30 THEN ''Rwanada''
            WHEN OPICS.FXDH.BR = 40 THEN ''Tanzania''
            WHEN OPICS.FXDH.BR = 50 THEN ''Zambia''
            WHEN OPICS.FXDH.BR = 60 THEN ''Zimbabwe''
       END AS COUNTRY,
       OPICS.FXDH.DEALNO,
       to_char(OPICS.FXDH.DEALDATE, ''YYYY-MM-DD'') AS Deal_Date,
       to_char(OPICS.FXDH.VDATE, ''YYYY-MM-DD'') AS V_Date,
       OPICS.FXDH.PS,
       OPICS.FXDH.CCY,
       OPICS.FXDH.CCYAMT,
       OPICS.FXDH.CCYRATE_8,
       OPICS.FXDH.CTRCCY,
       to_char(OPICS.OPER.OPERNAME) AS OPERNAME,
       to_char(OPICS.CUST.CFN1) AS CFN1,
       to_char(OPICS.PROD.PDESC) AS PDESC,
       to_char(OPICS.PORT.PORTDESC) AS Report_Description
FROM OPICS.FXDH AS FXDH
     INNER JOIN OPICS.OPER AS OPER ON (FXDH.BR = OPER.BR)
                                  AND (FXDH.TRAD = OPER.OPER)
     INNER JOIN OPICS.CUST AS CUST ON (FXDH.CUST = CUST.CNO)
     INNER JOIN OPICS.PROD AS PROD ON (FXDH.PRODCODE = PROD.PCODE)
     INNER JOIN OPICS.PORT AS PORT ON (FXDH.PORT = PORT.PORTFOLIO)
                                  AND (FXDH.BR = PORT.BR)
WHERE OPICS.FXDH.DEALDATE = ' + QUOTENAME(CONVERT(DATETIME , @var_date, 112),'''') + N'
  --dateString
  AND OPICS.FXDH.BR = 10;
--ORDER BY OPICS.FXDH.DEALDATE DESC'');';

--PRINT @SQL; --Your debugging best friend
EXEC sp_executesql @SQL;

请注意,我尚未对此进行测试,但我假设,Oracle接受日期字符串文字的ISO格式。如果没有,您可能需要更改样式类型或在OPENQUERY中应用一些逻辑,以将其更改为Oracle可接受的格式。