将CREATE TABLE更改为SELECT INTO时,DATETIME丢失hh:mm

时间:2018-07-12 17:11:26

标签: sql sql-server splunk-query

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

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

原始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”

2 个答案:

答案 0 :(得分:0)

您的第二条语句正在创建没有任何预设列定义的临时表#Stats。相反,它根据SELECT

的返回数据类型创建列。

这意味着SQL Server不会将正在讨论的输出读取为DATETIME,而是读取为STR

我会尝试在修改后的语句中使用CONVERT,以查看是否获得其他功能。

听起来这个问题主要是出于您的好奇心,所以我要补充一点,原始声明是完成您概述的标准方法。

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

答案 1 :(得分:0)

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