T-SQL 更新的日期字段与 select 语句中的日期格式不同

T-SQL Updated date field not the same as date format in select statement

在 SQL Server 2008 数据库中,我有一个财政年度 table,其中每个财政期间的 end_date 设置错误。句点 start_date 是日历月的第一天午夜,格式为 smalldatetime (2015-01-01 00:00:00)。 end_date 应该 是 start_date 月份 (2015-01-31 23:59:59) 最后一天的最后一秒。两个字段的数据类型都是smalldatetime.

下面给出了我希望 放入 end_date 字段中的所需日期和时间:

SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,start_date)+1,0))

但它会在时间结束时增加毫秒数:2015-01-31 23:59:59.000

当我尝试将其转换或转换为 smalldatetime 以省略毫秒时,它会将时间设置为 start_date 月份最后一天的 午夜2015-01-31 00:00:00。如果我只是用上面 select 语句中的代码更新 end_date 字段,也会发生这种情况。

如何使用正确的格式和值 (2015-01-31 23:59:59) 更新 end_date?

smalldatetime 不存储秒数,它总是 00。这就是减去一秒时自动转换的原因。
如果要存储秒数,则必须将列转换为不同的数据类型。

我没有意识到 smalldatetime 不存储秒数。 KekuSemau 的回答不是很正确,但它确实让我意识到我没有尝试做正确的事情,考虑到我必须更新的列的数据类型(不,我无法更改列的数据类型).

我所要做的就是调整查询以减去 minutesecond,smalldatetime 字段将与之一起使用:

cast(DATEADD(MINUTE,-1,DATEADD(mm, DATEDIFF(m,0,start_date)+1,0)) as smalldatetime)

所以我最终根据需要用 2015-01-31 23:50:00 更新了 end_date 列。