Jon*_*ley 188 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
Run Code Online (Sandbox Code Playgroud)
时
1899-12-30 12:30:00.000
1899-12-30 10:00:00.000
1899-12-30 10:00:00.000
Run Code Online (Sandbox Code Playgroud)
Lie*_*ers 245
你可以简单地添加两个.
Time part
你的Date
列始终为零 Date part
你的Time
栏也始终为零(基准日:1900年1月1日)添加它们会返回正确的结果.
SELECT Combined = MyDate + MyTime FROM MyTable
Run Code Online (Sandbox Code Playgroud)
SELECT Combined = MyDate + MyTime FROM MyTable
Run Code Online (Sandbox Code Playgroud)
Integers
并且date
是介绍的类型time
.如果你坚持添加,你可以使用$0001 0000 + $0000 0001 =
$0001 0001
看看如何在SQL Server中将日期和时间组合到datetime2?使用SQL Server 2008及更高版本防止精度损失.
Luk*_*keH 127
如果您的日期栏的时间要素和你的时间列的日期元素均为零,然后利芬的答案是你所需要的.如果你无法保证总是如此,那么它会变得稍微复杂一些:
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
Run Code Online (Sandbox Code Playgroud)
Joj*_*jje 24
这是一个没有任何字符转换的替代解决方案:
DATEADD(ms, DATEDIFF(ms, '00:00:00', [Time]), CONVERT(DATETIME, [Date]))
Run Code Online (Sandbox Code Playgroud)
你只会以这种方式获得毫秒精度,但通常都可以.我在SQL Server 2008中测试了这个.
bis*_*iso 13
这对我有用
CAST(Tbl.date as DATETIME) + CAST(Tbl.TimeFrom AS TIME)
Run Code Online (Sandbox Code Playgroud)
(在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)
Run Code Online (Sandbox Code Playgroud)
它很粗糙,准备好了,但它确实有效!
小智 9
如果您的两个字段都是日期时间,那么只需添加这些字段即可.
例如:
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
Run Code Online (Sandbox Code Playgroud)如果您使用日期和时间数据类型,则只需将时间转换为日期时间
例如:
Declare @d date, @t time
set @d = '2009-03-12';
set @t = '12:30:00.000';
select @d + cast(@t as datetime)
Run Code Online (Sandbox Code Playgroud)小智 6
这是我的解决方案,它忽略时间列的日期值
CAST(Tbl.date as DATETIME) + CAST(CAST(Tbl.TimeFrom AS TIME) as DATETIME)
Run Code Online (Sandbox Code Playgroud)
希望这对其他人有帮助