在SQL Server 2008数据库中,我有一个会计年度表,其中每个会计期间的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?
答案 0 :(得分:4)
smalldatetime不存储秒数,它总是00
。这就是为什么当你减去一秒时会有自动转换的原因
如果要存储秒数,则必须将列转换为其他数据类型。
答案 1 :(得分:-1)
我没有意识到smalldatetime没有存储秒数。 KekuSemau的回答并不是一个正确的答案,但它确实让我意识到我没有尝试做正确的事情,因为我必须更新列的数据类型(不,我无法和#39; t更改列的数据类型。)
我所要做的就是调整查询以减去分钟而第二,smalldatetime字段将与之一起使用:
cast(DATEADD(MINUTE,-1,DATEADD(mm, DATEDIFF(m,0,start_date)+1,0)) as smalldatetime)
因此,我最终根据需要使用2015-01-31 23:50:00
更新了end_date列。