当前位置:  开发笔记 > 数据库 > 正文

如何将来自一个字段的日期与来自另一个字段的时间相结合 - MS SQL Server

如何解决《如何将来自一个字段的日期与来自另一个字段的时间相结合-MSSQLServer》经验,为你挑选了6个好方法。

在我正在处理的摘录中,我有2 datetime列.一列存储日期,另一列存储时间,如图所示.

如何查询表以将这两个字段合并为1列类型datetime

日期

2009-03-12 00:00:00.000
2009-03-26 00:00:00.000
2009-03-26 00:00:00.000

1899-12-30 12:30:00.000
1899-12-30 10:00:00.000
1899-12-30 10:00:00.000

Lieven Keers.. 245

你可以简单地添加两个.

如果Time part你的Date列始终为零

并且Date part你的Time栏也始终为零(基准日:1900年1月1日)

添加它们会返回正确的结果.

SELECT Combined = MyDate + MyTime FROM MyTable

理由(对ErikE/dnolan的称赞)

SELECT Combined = MyDate + MyTime FROM MyTable

编辑有关新SQL Server 2008类型的信息

Integers并且date是介绍的类型time.如果你坚持添加,你可以使用$0001 0000 + $0000 0001 = $0001 0001

编辑2关于SQL Server 2008及以上版本的精度损失(对Martin Smith的称赞)

看看如何在SQL Server中将日期和时间组合到datetime2?使用SQL Server 2008及更高版本防止精度损失.



1> Lieven Keers..:

你可以简单地添加两个.

如果Time part你的Date列始终为零

并且Date part你的Time栏也始终为零(基准日:1900年1月1日)

添加它们会返回正确的结果.

SELECT Combined = MyDate + MyTime FROM MyTable

理由(对ErikE/dnolan的称赞)

SELECT Combined = MyDate + MyTime FROM MyTable

编辑有关新SQL Server 2008类型的信息

Integers并且date是介绍的类型time.如果你坚持添加,你可以使用$0001 0000 + $0000 0001 = $0001 0001

编辑2关于SQL Server 2008及以上版本的精度损失(对Martin Smith的称赞)

看看如何在SQL Server中将日期和时间组合到datetime2?使用SQL Server 2008及更高版本防止精度损失.


奥卡姆剃刀接受的答案!http://en.wikipedia.org/wiki/Occam's_razor
@Jon,只要date列的time元素和time列的date元素都为零,它就是真的.
SQL Server中的"零"日期是"1900-01-01",不是吗?

2> LukeH..:

如果您的日期栏的时间要素你的时间列的日期元素均为零,然后利芬的答案是你所需要的.如果你无法保证总是如此,那么它会变得稍微复杂一些:

SELECT DATEADD(day, 0, DATEDIFF(day, 0, your_date_column)) +
    DATEADD(day, 0 - DATEDIFF(day, 0, your_time_column), your_time_column)
FROM your_table


我有与OP相同的问题,除了我知道不需要的部分永远不会为零.因此,如果我可以两次投票给你,那么这是非常有用的!
您的SQL Server 2008版本不起作用.`数据类型的日期时间和时间在add运算符中是不兼容的

3> Jojje..:

这是一个没有任何字符转换的替代解决方案:

DATEADD(ms, DATEDIFF(ms, '00:00:00', [Time]), CONVERT(DATETIME, [Date]))

你只会以这种方式获得毫秒精度,但通常都可以.我在SQL Server 2008中测试了这个.



4> biso..:

这对我有用

CAST(Tbl.date as DATETIME) + CAST(Tbl.TimeFrom AS TIME)

(在SQL 2008 R2上)


SQL 2012数据类型datetime和time在add运算符中不兼容
我得到的数据类型datetime和time在add运算符中是不兼容的.SQL Server 2012上的错误
这不再适用于SQL Server 2012及更高版本(重大更改).详情请见:https://social.msdn.microsoft.com/forums/azure/en-US/8c163ac8-dae7-4d95-ad8f-3e4b52c3965d/difference-in-datetime-and-time-arithmetic-in-sql -azure-VS-SQL服务器2008 R2?论坛= ssdsgetstarted

5> CraigTP..:

如果您没有使用SQL Server 2008(即您只有一个DateTime数据类型),您可以使用以下(粗略和准备好的)TSQL来实现您想要的:

DECLARE @DateOnly AS datetime
DECLARE @TimeOnly AS datetime 

SET @DateOnly = '07 aug 2009 00:00:00'
SET @TimeOnly = '01 jan 1899 10:11:23'


-- Gives Date Only.
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly))

-- Gives Time Only.
SELECT DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)

-- Concatenates Date and Time parts.
SELECT
CAST(
    DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly)) + ' ' +
    DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)           
as datetime)

它很粗糙,准备好了,但它确实有效!



6> 小智..:

    如果您的两个字段都是日期时间,那么只需添加这些字段即可.

    例如:

    Declare @d datetime, @t datetime
    set @d = '2009-03-12 00:00:00.000';
    set @t = '1899-12-30 12:30:00.000';
    select @d + @t
    

    如果您使用日期和时间数据类型,则只需将时间转换为日期时间

    例如:

    Declare @d date, @t time
    set @d = '2009-03-12';
    set @t = '12:30:00.000';
    select @d + cast(@t as datetime)
    

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有