【问题标题】:Adding time and date添加时间和日期
【发布时间】:2015-08-03 07:30:12
【问题描述】:

我在 MSSQL 2008 R2 中有两列:WorkingdateStartime。 由于设计错误,应用程序开始时间未定义为日期+时间,而仅定义为时间(例如1899-12-30 16:00:00.000 表示下午 4:00)

现在,我遇到了无法添加日期和时间的问题。

为什么

 select convert(datetime,'2015-07-01 00:00:00.000') + convert(datetime,'1899-12-30 16:00:00.000')

2015-06-29 16:00:00.000  and not 2015-07-01 16:00:00.000

感谢您的帮助

抱歉:我找到了解决方案:日期来自 VBA,第一天是 1899-12-30 而不是 SQL 中的 1900-01-01 !!!因此我必须添加 +2 !!

【问题讨论】:

    标签: sql sql-server date sql-server-2008-r2


    【解决方案1】:

    试试这个:

    select dateadd(second, 
                    datepart(hour,'1899-12-30 16:00:00.000') * 3600 + 
                    datepart(minute,'1899-12-30 16:00:00.000') * 60 + 
                    datepart(second,'1899-12-30 16:00:00.000'),
                    '2015-07-01 00:00:00.000')
    

    这个想法是使用DATEADD 函数将所需时间(以秒为单位)添加到您的基准日期(2015-07-01 00:00:00.000)。为了将记录时间转换为秒,我们使用DATEPART 函数三次提取记录日期的小时、分钟和秒。

    要修复表格中的日期,您可以使用以下内容:

    UPDATE [dbo].[MyTable]
    SET [Date] =  DATEADD(SECOND, DATEPART(HOUR, [Date]) * 3600 + DATEPART(MINUTE, [Date]) * 60 + DATEPART(SECOND, [Date], '2015-07-01 00:00:00.000');
    

    【讨论】:

    • 是的,我知道,但我必须更改应用程序中的所有代码...!
    【解决方案2】:

    你不能轻易地使用 dateadd ,简单的方法是将一列的时间与另一列的日期时间相加,如下所示:

    SELECT 
      cast('1899-12-30 16:00:00.000' as time)+
      cast('2015-07-01 00:00:00.000' as datetime)
    

    结果:

    2015-07-01 16:00
    

    【讨论】:

    • 有趣的是,这是正确的,尽管 SELECT CAST(CONVERT(datetime,'1899-12-30 16:00:00.000') as float) 是负面的!谢谢!
    • 为什么要将日期时间转换为浮点数?这总是可以用更好的方法来完成
    • 我只是将它转换为检查数值。
    • 如何在 Oracle 中实现这一点?
    【解决方案3】:

    通常我会一直使用DATEADD 进行这种类型的操作。

    希望对你有帮助

    【讨论】:

    • 您不应该在没有提供示例的情况下发布这样的答案。特别是因为 DATEADD 在此示例中不是一个简单的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2017-11-17
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多