在我正在处理的提取中,我有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
在我正在处理的提取中,我有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
当前回答
这是我的解决方案,它忽略了时间列的日期值
CAST(Tbl.date as DATETIME) + CAST(CAST(Tbl.TimeFrom AS TIME) as DATETIME)
希望这能帮助到其他人
其他回答
现有的答案不解决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数据类型。
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
简单地将两者连接起来,但首先将它们强制转换,如下所示
select cast(concat(Cast(DateField as varchar), ' ', Cast(TimeField as varchar)) as datetime) as DateWithTime from TableName;
你可以简单地把两者相加。
如果日期列的时间部分始终为零 时间列的日期部分也始终为零(基准日期: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及更高。
找到这个工作的两个日期,你想从一个日期和日期从另一个:
declare @Time as datetime = '2021-11-19 12:34'
declare @Date as datetime = '2021-10-10'
SELECT @time + datediff(day, @Time, @Date)