SQL Server连接日期和时间

时间:2014-03-25 19:15:04

标签: sql sql-server

我在SQL Server中有两列是“datetime”类型。但是,一列包含我需要的有效日期,另一列仅包含时间(小时,分钟,...)。

如何从第一列中提取日期以及从最后一列中提取时间,并将它们连接在一起成为有效的日期时间列。

我尝试过:

select 
[Created on],
[Created At],
LEFT([Created On],11),
RIGHT([Created At],8),
LEFT([Created On],11) + RIGHT([Created At],8)
from.. 

但是,输出有意义,但我希望它是军事格式的有效时间戳类型,作为第一列和第二列。 我该怎么办?

enter image description here

5 个答案:

答案 0 :(得分:1)

我做了一些谷歌,下面这个解决方案适合我。

select 
[Created on],
[Created At],
CAST(Convert(date, [Created on]) as datetime) + CAST(Convert(time, [Created At]) as datetime),
LEFT([Created On],11) + RIGHT([Created At],8)
from [VERICAL$Purch_ Inv_ Header] 
where [Posting Date] > '2014-02-01

enter image description here

答案 1 :(得分:0)

尝试使用此表达式: -

select
DATEADD(MILLISECOND,datepart(MILLISECOND,created_at),
DATEADD(SECOND,datepart(SECOND,created_at),
DATEADD(minute,datepart(minute,created_at),
DATEADD(HOUR,datepart(hour,created_at),created_on))))
from ..

它实际上会从created at列中找到时间部分并添加到created on

答案 2 :(得分:0)

使用DATEPART从相应列中抓取相关的日期和时间段,然后使用DATETIMEFROMPARTS(如果在SQL Server 2012上)重新组合在一起。

SQLFiddle

答案 3 :(得分:0)

应该可以添加它们,+

select 
[Created on],
[Created At],
LEFT([Created On],11),
RIGHT([Created At],8),
[Created On] + [Created At] as whatever

答案 4 :(得分:0)

在我看来,最简洁的方法是利用SQL Server实现datetime的方式:SQL Server将datetime值实现为一对带符号的32位整数

  • 高阶词是日期组件。它是1900年1月1日SQL Server时代的偏移量。

  • 低位字是时间分量。它是从一天开始(00:00:00.000)开始的偏移量(毫秒)。

掌握了这些知识后,我们可以看到实施情况:

select convert(binary(8),convert(datetime,'March 17, 2014'))

返回

0x0000A2F100000000

选择转换(二进制(8),转换(datetime,' 17:55:23'))

返回

0x0000000001275CE4

因此,要将一个datetime值的日期组件与另一个的时间组件合并:

convert(datetime,
    substring(convert(binary(8),date_only_column),1,4)
  + substring(convert(binary(8),time_only_column),5,4)
  )

容易!

格式化为ISO 8601字符串:

convert(varchar(32),
  convert(datetime,
      substring(convert(binary(8),date_only_column),1,4)
    + substring(convert(binary(8),time_only_column),5,4)
    ) ,
    120 -- or 121 if your want milliseconds.
  )