0

我目前正在将我公司的所有报告迁移到 Splunk Data Labs 输入以供摄取。报告使用 CREATE TABLE 格式创建临时表,该格式与 Splunk 不兼容,但是 SELECT INTO 格式可以正常工作。

但是,当更改为 SELECT INTO 格式时,我得到的错误是应该是 MM/DD/YYYY hh:mm 格式的 DATETIME 变量丢失了 hh:mm 结尾,而是显示 MM/DD/YYYY MM/DD/年年:

原始 SQL:

CREATE TABLE #Stats#(date_slice DATETIME NULL, raw_value REAL NULL)
INSERT INTO #Stats#
    SELECT CONVERT(CHAR(11), data_datetime, 111) + ' ' +
        CASE WHEN DATEPART(MINUTE, data_datetime) < 30 THEN
        RIGHT('0' + LTRIM(str(DATEPART(hour, data_datetime))), 2) + ':00' ELSE
        RIGHT('0' + LTRIM(str(DATEPART(hour, data_datetime))), 2) + ':30' END AS date_hour
        ,SUM(ship_qty) AS moves
    FROM #tmpAllData
    GROUP BY CONVERT(CHAR(11), data_datetime, 111) + ' ' +
        case when DATEPART(minute, data_datetime) < 30 THEN
        RIGHT('0' + LTRIM(str(DATEPART(hour, data_datetime))), 2) + ':00' ELSE
        RIGHT('0' + LTRIM(str(DATEPART(hour, data_datetime))), 2) + ':30' END
    ORDER BY 1

修改后的 SQL:

--CREATE TABLE #Stats#(date_slice DATETIME NULL, raw_value REAL NULL)
SELECT CONVERT(CHAR(11), data_datetime, 111) + ' ' +
    CASE WHEN DATEPART(MINUTE, data_datetime) < 30 THEN
    RIGHT('0' + LTRIM(str(DATEPART(hour, data_datetime))), 2) + ':00' ELSE
    RIGHT('0' + LTRIM(str(DATEPART(hour, data_datetime))), 2) + ':30' END date_slice
    ,SUM(ship_qty) raw_value
INTO #Stats#
FROM #tmpAllData
GROUP BY CONVERT(CHAR(11), data_datetime, 111) + ' ' +
    case when DATEPART(minute, data_datetime) < 30 THEN
    RIGHT('0' + LTRIM(str(DATEPART(hour, data_datetime))), 2) + ':00' ELSE
    RIGHT('0' + LTRIM(str(DATEPART(hour, data_datetime))), 2) + ':30' END
ORDER BY 1
  • 原始输出:“07/12/2018 10:00:00”
  • 修改后的输出:“2018/07/12 2018/07/12”
4

2 回答 2

0

您的第二条语句是创建#Stats没有任何预设列定义的临时表。而是根据返回的数据类型创建列SELECT

这意味着 SQL Server 不会将有问题的输出作为 a 读取,DATETIME而是作为STR.

我会尝试CONVERT在您修改后的语句中使用 a 来查看您是否获得不同的功能。

听起来这个问题主要是出于您的好奇心,因此我将补充说原始陈述是完成您概述的内容的标准方法。

这是因为SELECT...INTO语句对于新用户来说更难阅读和修改,并且因为它们可能会导致一些意想不到的功能,如您在上面显示的那样。

于 2018-07-12T17:37:36.343 回答
0

所以,类似于爱德华所说的。我发布的查询返回了 DATETIME 数据类型,但是,在查询的最后,当它选择要显示给用户的所有信息时,它被转换为介于两者之间的 CHAR,所以我只是在转换之前将其转换为 DATETIME到 CHAR 并拆分值。

于 2018-07-12T19:40:49.410 回答