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

时间:2009-03-31 08:46:20

标签: sql sql-server datetime

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

18 个答案:

答案 0 :(得分:240)

您可以简单地添加两个。

  • 如果 Time part列的Date始终为零
  • Date part列的Time也始终为零(基准日期:1900年1月1日)

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

SELECT Combined = MyDate + MyTime FROM MyTable

理由(感谢ErikE / dnolan)

  

由于日期存储为两个4字节的方式,它的工作方式如此   Integers左侧4字节为date,右侧为time   4字节是$0001 0000 + $0000 0001 = $0001 0001。就像做Date

一样

编辑新的SQL Server 2008类型

TimeSQL Server 2008Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)中引入的类型。如果您坚持要添加,可以使用{{1}}

Edit2关于SQL Server 2008及更高版本的精度损失(对Martin Smith的赞誉)

查看How to combine date and time to datetime2 in SQL Server?以防止使用SQL Server 2008及更高版本丢失精确度。

答案 1 :(得分:126)

如果日期列的时间元素时间列的日期元素都为零,那么Lieven's answer就是您所需要的。如果你不能保证总是如此,那就变得稍微复杂了:

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

答案 2 :(得分:23)

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

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

这种方式只能达到毫秒精度,但这通常没问题。我在SQL Server 2008中对此进行了测试。

答案 3 :(得分:11)

这对我有用

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

(在SQL 2008 R2上)

答案 4 :(得分:9)

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

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

答案 5 :(得分:9)

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

    例如:

    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
    
  2. 如果你使用Date&时间数据类型然后只是将时间转换为日期时间

    例如:

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

答案 6 :(得分:3)

将日期时间字段中存储的第一个日期转换为字符串,然后将日期时间字段中存储的时间转换为字符串,将两者追加并转换回使用已知转换格式的日期时间字段。

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

答案 7 :(得分:1)

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

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

希望这对其他人有帮助

答案 8 :(得分:1)

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

答案 9 :(得分:1)

我上面有很多错误,所以我就这样做了

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

它对我有用。

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

像魅力一样工作

答案 12 :(得分:0)

另一种方法是使用Type.LEGACYCONCAT,请注意,您需要使用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))

在SQL Server 14上测试

答案 13 :(得分:0)

简单地将两者连接在一起,但首先将它们转换如下

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

答案 14 :(得分:0)

select s.SalesID from SalesTbl s 
        where cast(cast(s.SaleDate  as date) as datetime) + cast(cast(s.SaleCreatedDate as time) as datetime)  

@FromDate 和 @ToDate 之间

答案 15 :(得分:-1)

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

答案 16 :(得分:-1)

我遇到了类似的情况,我不得不将Date和Time字段合并到DateTime字段。上述解决方案均无效,特别是添加两个字段作为添加这两个字段的数据类型是不相同的。

我创建了以下解决方案,在其中添加了小时,然后是分钟。这对我来说效果很好。请检查一下,如果遇到任何问题,请告诉我。

;使用tbl 如 (     选择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)),DATEADD(HH,DATEPART(HOUR,CAST(tbl.StatusTime AS TIME)),CAST(tbl.StatusDate as DATETIME))) 来自tbl

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

答案 17 :(得分:-1)

要结合日期时间列中的日期和其他日期时间列的时间,这是最适合您的解决方案:

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