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



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

但是,当更改为SELECT INTO格式时,我遇到的错误是DATETIME变量(应为MM/DD/YYYY hh:MM格式(丢失了hh:MM结尾,而是显示MM/DD/YYY 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/2018/07/12">

您的第二条语句是在没有任何预设列定义的情况下创建临时表#Stats。相反,它根据SELECT的返回数据类型创建列

这意味着SQL Server不是以DATETIME的形式读取有问题的输出,而是以STR的形式读取。

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

听起来这个问题主要是出于你的好奇心,所以我要补充一点,最初的陈述是完成你所概述的内容的标准方式。

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

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

最新更新