在我正在处理的提取中,我有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

DECLARE @Dates table ([Date] datetime);
DECLARE @Times table ([Time] datetime);

INSERT INTO @Dates VALUES('2009-03-12 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-26 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-30 00:00:00.000');

INSERT INTO @Times VALUES('1899-12-30 12:30:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');

WITH Dates (ID, [Date])
AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [Date]), [Date] FROM @Dates
), Times (ID, [Time])
AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [Time]), [Time] FROM @Times
)
SELECT Dates.[Date] + Times.[Time] FROM Dates
    JOIN Times ON Times.ID = Dates.ID

打印:

2009-03-12 10:00:00.000
2009-03-26 10:00:00.000
2009-03-30 12:30: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及更高。


如果你没有使用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)

虽然粗糙,但很管用!


将存储在datetime字段中的第一个日期转换为字符串,然后将存储在datetime字段中的时间转换为字符串,附加两个日期并转换回datetime字段,所有这些都使用已知的转换格式。

Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103) 

如果两个字段都是datetime,那么简单地添加它们就可以了。 例如: 声明@d datetime, @t datetime Set @d = '2009-03-12 00:00:00.000'; Set @t = ' 189-12-30 12:30:00.000'; 选择@d + @t 如果您使用Date & Time数据类型,则只需将时间转换为datetime 例如: 声明@d日期,@t时间 Set @d = '2009-03-12'; Set @t = '12:30:00.000'; 选择@d + cast(@t as datetime)


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

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

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


这对我很有效

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

(适用于SQL 2008 R2)


结合日期从一个datetime列和时间从另一个datetime列,这是最好的,最快的解决方案为您:

select cast(cast(DateColumn as date) as datetime) + cast(TimeColumn as datetime) from YourTable

SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table

效果非常好


将两个字段转换为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)

如上所述,我有很多错误,所以我这样做

try_parse(concat(convert(date,Arrival_date),' ',arrival_time) as datetime) AS ArrivalDateTime

这对我很管用。


SELECT (CAST(@TimeField As Date) As DateTime) + CAST(CAST(@TimeField As Time) As DateTime)


另一种方法是使用CONCATand CAST,请注意,需要使用DATETIME2(x)才能使其工作。你可以将x设置为0- 7,7之间的任何值,这意味着没有精度损失。

DECLARE @date date = '2018-03-12'
DECLARE @time time = '07:00:00.0000000'
SELECT CAST(CONCAT(@date, ' ', @time) AS DATETIME2(7))

返回2018-03-12 07:00:00.0000000

在SQL Server 14上测试


我遇到了类似的情况,我必须将日期和时间字段合并到DateTime字段。上面提到的解决方案都不行,特别是添加两个字段作为添加这两个字段的数据类型是不一样的。

我创建了下面的解决方案,其中我添加了小时和分钟部分的日期。这对我来说非常有效。请查看一下,如果遇到任何问题请告诉我。

与资源; 作为 ( select StatusTime = '12/30/1899 5:17:00 PM', StatusDate = '7/24/2019 12:00:00 AM' ) select DATEADD(MI, DATEPART(MINUTE,CAST(tbl))StatusTime AS TIME)),DATEADD(HH, DATEPART(小时,CAST(tbl))。StatusTime AS TIME)), CAST(tbl。StatusDate为DATETIME)) 从台

执行结果:2019-07-24 17:17:00.000


简单地将两者连接起来,但首先将它们强制转换,如下所示

select cast(concat(Cast(DateField as varchar), ' ', Cast(TimeField as varchar)) as datetime) as DateWithTime from TableName;

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

这是我的解决方案,它忽略了时间列的日期值

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

希望这能帮助到其他人


找到这个工作的两个日期,你想从一个日期和日期从另一个:

declare @Time as datetime = '2021-11-19 12:34'
declare @Date as datetime = '2021-10-10'
SELECT @time + datediff(day, @Time, @Date)

现有的答案不解决datetime2数据类型,所以我将添加我的:

假设你想添加一个时间值到datetime2值,其中:

datetime2值可以包含非零时间分量和/或小数秒 时间值可以包含值23:59:59.9999999,即86,399.9999999秒,86,399,999,999.9微秒或86,399,999,999,900纳秒¹

由于dateadd函数¹的限制,您必须分两步添加它们:

将时间值转换为秒并使用dateadd(second,…) 从时间值中提取纳秒,并使用dateadd(nanosecond,…)将它们添加到上面计算的日期中

declare @dv datetime2 = '2000-01-01 12:34:56.7890123';
declare @tv time = '23:59:59.9999999';
select dateadd(
    nanosecond,
    datepart(nanosecond, @tv),
    dateadd(
        second,
        datepart(hour, @tv) * 60 * 60 + datepart(minute, @tv) * 60 + datepart(second, @tv),
        @dv
    )
);
-- 2000-01-02 12:34:56.7890122

¹纳秒值可能不适合dateadd函数期望的int数据类型。