Answers:
您可以简单地将两者相加。
Time part
你的Date
列始终为零 Date part
你的Time
栏也始终为零(基准日:1900年1月1日)添加它们将返回正确的结果。
SELECT Combined = MyDate + MyTime FROM MyTable
由于日期存储为两个4字节
Integers
,左边的4个字节为date
,右边的4个字节为的方式,因此它可以像这样工作time
。就像在做$0001 0000 + $0000 0001 = $0001 0001
Date
和Time
是在中引入的类型SQL Server 2008
。如果您坚持添加,可以使用Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)
看看如何在SQL Server中将日期和时间结合到datetime2?以防止使用SQL Server 2008及更高版本的精度损失。
1900-01-01
,不是吗?
float
。您在哪里在哪里学习的?它们被存储为整数:日期部分是因为锚定日期的天数,和时间部分是因为午夜“滴答”的次数,蜱被定义为1/300 S表示datetime
和更精确的time
和datetime2
。
如果您的日期栏的时间要素和你的时间列的日期元素均为零,然后利芬的答案是你所需要的。如果您不能保证始终如此,那么情况会变得稍微复杂一些:
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
The data types datetime and time are incompatible in the add operator.
这对我有用
CAST(Tbl.date as DATETIME) + CAST(Tbl.TimeFrom AS TIME)
(在SQL 2008 R2上)
如果您不使用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)
它很粗糙,已经准备好了,但是可以用!
如果您的两个字段均为日期时间,则只需将其添加即可。
例如:
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)
将存储在datetime字段中的第一个日期转换为字符串,然后将存储在datetime字段中的时间转换为字符串,将两者附加在一起,并使用已知的转换格式转换回datetime字段。
Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103)
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(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table
奇迹般有效
要将日期时间列中的日期与另一个日期时间列中的时间结合起来,这是最快速的解决方案:
select cast(cast(DateColumn as date) as datetime) + cast(TimeColumn as datetime) from YourTable
我遇到了类似的情况,我不得不将日期和时间字段合并到DateTime字段。上述解决方案均无效,特别是添加两个字段作为添加这两个字段的数据类型是不相同的。
我创建了以下解决方案,在其中添加了小时,然后是分钟。这对我来说效果很好。请检查出来,如果遇到任何问题,请告诉我。
;使用tbl as(select StatusTime = '12 / 30/1899 5:17:00 PM',StatusDate ='7/24/2019 12:00:00 AM')选择DATEADD(MI,DATEPART(MINUTE,CAST(tbl .StatusTime AS TIME)),tbl的DATEADD(HH,DATEPART(HOUR,CAST(tbl.StatusTime AS TIME)),CAST(tbl.StatusDate as DATETIME))))
结果:2019-07-24 17:17:00.000