我在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..
但是,输出有意义,但我希望它是军事格式的有效时间戳类型,作为第一列和第二列。 我该怎么办?
答案 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
答案 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上)重新组合在一起。
答案 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.
)