将 CREATE TABLE 更改为 SELECT INTO 时 DATETIME 丢失 hh:mm
DATETIME losing hh:mm when changing CREATE TABLE to SELECT INTO
我目前正在将我公司的所有报告迁移到 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”
您的第二个语句正在创建没有任何预设列定义的临时 table #Stats
。它而是根据 SELECT
的 return 数据类型创建列
这意味着 SQL 服务器没有将有问题的输出读取为 DATETIME
,而是读取为 STR
。
我会尝试在您修改后的语句中使用 CONVERT
来查看您是否获得了不同的功能。
听起来这个问题主要是出于您的好奇心,所以我要补充一点,原始陈述是完成您概述的内容的标准方法。
这是因为 SELECT
... INTO
语句对于新用户来说更难阅读和修改,而且它们可能会导致一些意想不到的功能,如您在上面显示的那样。
所以,类似于爱德华所说的。我发布的查询返回一个 DATETIME 数据类型,但是,在查询的最后,当它选择所有信息显示给用户时,它被转换为介于两者之间的 CHAR,所以我只是在转换之前将它转换为 DATETIME到 CHAR 并拆分值。
我目前正在将我公司的所有报告迁移到 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”
您的第二个语句正在创建没有任何预设列定义的临时 table #Stats
。它而是根据 SELECT
这意味着 SQL 服务器没有将有问题的输出读取为 DATETIME
,而是读取为 STR
。
我会尝试在您修改后的语句中使用 CONVERT
来查看您是否获得了不同的功能。
听起来这个问题主要是出于您的好奇心,所以我要补充一点,原始陈述是完成您概述的内容的标准方法。
这是因为 SELECT
... INTO
语句对于新用户来说更难阅读和修改,而且它们可能会导致一些意想不到的功能,如您在上面显示的那样。
所以,类似于爱德华所说的。我发布的查询返回一个 DATETIME 数据类型,但是,在查询的最后,当它选择所有信息显示给用户时,它被转换为介于两者之间的 CHAR,所以我只是在转换之前将它转换为 DATETIME到 CHAR 并拆分值。