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

时间:2015-01-31 16:10:41

标签: sql-server-2008 tsql datetime-format

在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?

2 个答案:

答案 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列。

相关问题