SQL 嵌套转换的日期时间转换遇到随机转换错误
SQL Date-Time Conversion with nested converts experiences random conversion errors
寻求帮助解决一个奇怪的问题,如果有人有想法:
我有一个 SQL 该语句大部分时间在 T-SQL 脚本中有效,但偶尔会崩溃。我已确定发生崩溃的数据,但无法确定有效数据行之间的任何差异。
此代码的目标是将时间添加到已存在的日期时间值,该值具有 00:00:00 作为第二时间列中的时间(如下所述)。我的目标是将两列合并为 YYYY-MM-DD HH:MM:SS 格式,但我必须先将它们转换为 char 以 trim 关闭原始 00:00:00.
列
LogDate - 仅包含 DateTime 格式的日期 (YYYY-MM-DD HH:MM:SS)
LogTime - 包含操作的时间并且采用 varchar 格式 (HH:MM)
SQL 转换
SELECT CONVERT(DATETIME, CONVERT(CHAR(8), LogDate, 112) + ' ' + CONVERT(CHAR(8), LogTime, 108))
FROM TestTable
WHERE EventSerial = '100001'
但是,如果我将上述语句中的 EventSerial 更改为不同的行,例如“100002”,则该语句有效。
每一行的数据如下:
EventSerial 100001 的值:
日志日期:2015-04-02 00:00:00.000
日志时间:10:04
EventSerial 100002 的值:
日志日期:2015-04-02 00:00:00.000
日志时间:10:48
运行数据集1失败,运行数据集2产生输出。此外,运行 没有最终日期时间转换的代码可以工作,或者如果我 运行 手动使用字符串的代码它可以工作(如下所述:)
SELECT CONVERT(CHAR(8), LogDate, 112) + ' ' + CONVERT(CHAR(8), LogTime, 108)
FROM TestTable
WHERE EventSerial = '100001'
SELECT CONVERT(DATETIME, '20150402 10:48')
SELECT CONVERT(DATETIME, '20150402 10:04')
任何建议,我确定它是我遗漏的一些愚蠢的东西(而且我可能在这个问题上走了很长的路。所需的输出将是 2015-04-02 10:04:00
首先,日期时间没有格式。 ()
其次,您不需要将 datetime
值转换为 char
来添加小时和分钟,只需使用 DateAdd
:
SELECT DATEADD(Minute,
CAST(RIGHT(LogTime, 2) as int),
DATEADD(Hour,
CAST(LEFT(LogTime, 2) as int),
LogDate
)
)
FROM TestTable
WHERE EventSerial = '100001'
此外,请注意 convert
不包含 yyyymmdd hh:mm
的样式
注意:这里直接写代码,可能会有一些错误。
我不确定您为什么会收到错误...可能在您的 varchar 时间字段中有一些看不见的字符...例如制表符或其他内容?试试这个查询:
SELECT ascii(substring(LogTime,1,1)) Char1,
ascii(substring(LogTime,2,1)) Char2,
ascii(substring(LogTime,3,1)) Char3,
ascii(substring(LogTime,4,1)) Char4,
ascii(substring(LogTime,5,1)) Char5
FROM TestTable
WHERE EventSerial = '100001'
它应该显示这些结果:
Char1 Char2 Char3 Char4 Char5
----------- ----------- ----------- ----------- -----------
49 48 58 48 52
(1 row(s) affected)
这样效率会高一点:
select dateadd(minute, datediff(minute,0, LogTime), LogDate)
FROM TestTable
但这假设您的日期字段始终具有 00:00:00 时间信息。如果你想确保它也被剥离,你可以使用:
select dateadd(minute, datediff(minute,0, LogTime), dateadd(day, datediff(day, 0, Logdate),0))
FROM TestTable
寻求帮助解决一个奇怪的问题,如果有人有想法:
我有一个 SQL 该语句大部分时间在 T-SQL 脚本中有效,但偶尔会崩溃。我已确定发生崩溃的数据,但无法确定有效数据行之间的任何差异。
此代码的目标是将时间添加到已存在的日期时间值,该值具有 00:00:00 作为第二时间列中的时间(如下所述)。我的目标是将两列合并为 YYYY-MM-DD HH:MM:SS 格式,但我必须先将它们转换为 char 以 trim 关闭原始 00:00:00.
列
LogDate - 仅包含 DateTime 格式的日期 (YYYY-MM-DD HH:MM:SS)
LogTime - 包含操作的时间并且采用 varchar 格式 (HH:MM)
SQL 转换
SELECT CONVERT(DATETIME, CONVERT(CHAR(8), LogDate, 112) + ' ' + CONVERT(CHAR(8), LogTime, 108))
FROM TestTable
WHERE EventSerial = '100001'
但是,如果我将上述语句中的 EventSerial 更改为不同的行,例如“100002”,则该语句有效。
每一行的数据如下:
EventSerial 100001 的值: 日志日期:2015-04-02 00:00:00.000 日志时间:10:04
EventSerial 100002 的值: 日志日期:2015-04-02 00:00:00.000 日志时间:10:48
运行数据集1失败,运行数据集2产生输出。此外,运行 没有最终日期时间转换的代码可以工作,或者如果我 运行 手动使用字符串的代码它可以工作(如下所述:)
SELECT CONVERT(CHAR(8), LogDate, 112) + ' ' + CONVERT(CHAR(8), LogTime, 108)
FROM TestTable
WHERE EventSerial = '100001'
SELECT CONVERT(DATETIME, '20150402 10:48')
SELECT CONVERT(DATETIME, '20150402 10:04')
任何建议,我确定它是我遗漏的一些愚蠢的东西(而且我可能在这个问题上走了很长的路。所需的输出将是 2015-04-02 10:04:00
首先,日期时间没有格式。 (
其次,您不需要将 datetime
值转换为 char
来添加小时和分钟,只需使用 DateAdd
:
SELECT DATEADD(Minute,
CAST(RIGHT(LogTime, 2) as int),
DATEADD(Hour,
CAST(LEFT(LogTime, 2) as int),
LogDate
)
)
FROM TestTable
WHERE EventSerial = '100001'
此外,请注意 convert
不包含 yyyymmdd hh:mm
注意:这里直接写代码,可能会有一些错误。
我不确定您为什么会收到错误...可能在您的 varchar 时间字段中有一些看不见的字符...例如制表符或其他内容?试试这个查询:
SELECT ascii(substring(LogTime,1,1)) Char1,
ascii(substring(LogTime,2,1)) Char2,
ascii(substring(LogTime,3,1)) Char3,
ascii(substring(LogTime,4,1)) Char4,
ascii(substring(LogTime,5,1)) Char5
FROM TestTable
WHERE EventSerial = '100001'
它应该显示这些结果:
Char1 Char2 Char3 Char4 Char5
----------- ----------- ----------- ----------- -----------
49 48 58 48 52
(1 row(s) affected)
这样效率会高一点:
select dateadd(minute, datediff(minute,0, LogTime), LogDate)
FROM TestTable
但这假设您的日期字段始终具有 00:00:00 时间信息。如果你想确保它也被剥离,你可以使用:
select dateadd(minute, datediff(minute,0, LogTime), dateadd(day, datediff(day, 0, Logdate),0))
FROM TestTable