sql-server - 使用 DATEADD 添加秒数会返回四舍五入为分钟的值 - 为什么?

标签 sql-server t-sql datetime

我需要添加 LAST_DT(以小日期时间形式提供,但不带 hhmmss)和 LAST_TM(以 nvarchar 形式提供)来计算真实的日期时间值。
我正在尝试使用DateAdd增加 LAST_TM 中 hhmmss 提供的日期。 小时和分钟添加成功,但秒数向上或向下舍入为分钟。 这是我的代码

DECLARE @LAST_DT smalldatetime = '2017-10-18'
DECLARE @LAST_TM nvarchar(6) = '153954'

SELECT
 @LAST_DT
 ,@LAST_TM
 ,DATEADD(minute, CAST(substring(@LAST_TM,3,2) AS INT),
   DATEADD(hour, CAST(left(@LAST_TM,2) AS INT),@LAST_DT)) AS Dt_HhMm
 ,Right(@LAST_TM,2) As Secs
 ,DATEADD(second, CAST(Right(@LAST_TM,2) AS INT),
   DATEADD(minute, CAST(substring(@LAST_TM,3,2) AS INT),
    DATEADD(hour, CAST(left(@LAST_TM,2) AS INT),@LAST_DT))) AS Dt_HhMmSs

以及相应的结果

LAST_DT      LAST_TM  Dt_HhMm               Secs   Dt_HhMmSs
2017-10-18   153954   2017-10-18 15:39:00   54     2017-10-18 15:40:00

为什么秒数要四舍五入到最接近的分钟?

(我使用的是 MS SQL Server 2008 R2)

最佳答案

我想我实际上回答了我自己的问题。 LAST_DT 是小日期时间,根据定义不包括秒。 将 LAST_DT 转换为日期时间:

SELECT
 CC.LAST_DT
 ,CC.LAST_TM
 ,DATEADD(second, CAST(Right(CC.LAST_TM,2) AS INT),
   DATEADD(minute, CAST(substring(CC.LAST_TM,3,2) AS INT),
    DATEADD(hour, CAST(left(CC.LAST_TM,2) AS INT),CAST(CC.LAST_DT As datetime)))) 
    AS Dt+HhMmSs

解决了问题。

我很好奇为什么小日期时间会显示秒,而这显然不是数据类型的一部分?这非常令人困惑/误导。

关于sql-server - 使用 DATEADD 添加秒数会返回四舍五入为分钟的值 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46821755/

相关文章:

.net - ASP.NET MVC 和 SQL Server 报告服务

sql-server - 列名称或提供的值的数量与表定义不匹配。为什么?

sql-server - 如何使用打印语句调试存储过程?

t-sql - 我可以在 where 子句中间使用 If/Else 或 Case 吗?

sql-server - 根据目标表中两个日期之间的日期连接表

sql-server - 是否可以在 Azure SQL 数据库中选择标签?

python - 如何在 Python 3.x 中使用 dateutil.relativedelta?

sql-server - 允许对所有用户进行临时分发查询

python - 如何在 Python 中正确合并重叠的日期时间范围

python - Pandas 将带有 unix 时间戳(以毫秒为单位)的行转换为日期时间