在我正在处理的提取中,我有2个datetime列。一列存储日期,另一列存储如下所示的时间。

如何查询表,将这两个字段组合成类型为datetime的1列?

日期

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的答案就是您所需要的。如果你不能保证情况总是如此,那么事情就会变得稍微复杂一些:

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

其他回答

你可以简单地把两者相加。

如果日期列的时间部分始终为零 时间列的日期部分也始终为零(基准日期:1900年1月1日)

将它们相加将返回正确的结果。

SELECT Combined = MyDate + MyTime FROM MyTable

原理(向ErikE/dnolan致敬)

它是这样工作的,因为日期存储为两个4字节 左4字节为日期,右4字节为日期的整数 4字节是时间。这就像$ 00001 + $ 00000001 = 0001美元0001

编辑关于新的SQL Server 2008类型

日期和时间是SQL Server 2008中引入的类型。如果你坚持添加,你可以使用组合= CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)

关于SQL Server 2008及以上版本的准确性损失的Edit2(向Martin Smith致敬)

看看如何结合日期和时间datetime2在SQL Server?以防止精度损失使用SQL Server 2008及更高。

将两个字段转换为DATETIME:

SELECT CAST(@DateField as DATETIME) + CAST(@TimeField AS DATETIME)

如果你正在使用Getdate(),首先使用这个:

DECLARE @FechaActual DATETIME = CONVERT(DATE, GETDATE());
SELECT CAST(@FechaActual as DATETIME) + CAST(@HoraInicioTurno AS DATETIME)

如果日期列的时间元素和时间列的日期元素都为零,那么Lieven的答案就是您所需要的。如果你不能保证情况总是如此,那么事情就会变得稍微复杂一些:

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
select s.SalesID from SalesTbl s 
        where cast(cast(s.SaleDate  as date) as datetime) + cast(cast(s.SaleCreatedDate as time) as datetime) between @FromDate and @ToDate

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

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

这样你只能得到毫秒的精度,但这通常是可以的。我已经在SQL Server 2008中对此进行了测试。