添加到 DATE 小时 - SQL
Add to DATE hour - TSQL
我有一个列类型 time(7)
。
我想要的是在时间列中添加日期。
我设法使用 GETDATE()
函数获得唯一的日期,但我无法在日期旁边添加时间部分。
查询:
SELECT [Compay]
,[Time]
,CAST(GETDATE() AS DATE) AS Today
,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) AS Today_AS_Nvarchar
,CAST([Time] AS NVARCHAR) AS Time_AS_Nvarchar
,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) + ' ' + CAST([Time] AS NVARCHAR) AS Today_Time_AS_Nvarchar
,CONVERT(datetime,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) + ' ' + CAST([Time] AS NVARCHAR),103)
FROM [Testing_Env].[dbo].[Com_CD_Test]
错误:
Conversion failed when converting date and/or time from character string.
错误发生在CONVERT(datetime,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) + ' ' + CAST([Time] AS NVARCHAR),103)
有什么easier/orthodox方法可以实现吗?
您不能像添加旧数据类型那样将新的日期和时间数据类型添加在一起;我个人认为这也更好,因为它阻止人们将日期和时间视为数值。
假设 你有一个 date
列和一个 time
列,你有几个选项。第一种是将 CAST
/CONVERT
都添加到 datetime
,然后将它们“相加”。因为“旧”数据类型的工作方式更像是数值,所以如果 time
的精度为 3
或更高(因为 datetime
是只精确到 1/300 秒):
DECLARE @TimeValue time(7) = '17:52:12.1234567',
@DateValue date = '20211016';
SELECT CONVERT(datetime, @DateValue) + CONVERT(datetime, @TimeValue);
如果不能选择降低准确性,那么您可以可以对date
值使用转换并使用DATEDIFF
和DATEADD
.对于 time(7)
,您需要使用纳秒(因为微秒不够准确)。不幸的是,这带来了另一个问题; DATEADD
无法处理 bigint
值(仍然)并且没有 DATEADD_BIG
(就像有 DATEDIFF_BIG
),所以这变得过于复杂。需要先求出毫秒差,然后加上纳秒的余数,仍然可以精确到1/1000000秒:
DECLARE @TimeValue time(7) = '17:52:12.1234567',
@DateValue date = '20211016';
SELECT DATEADD(NANOSECOND,DATEDIFF_BIG(NANOSECOND,'00:00:00', @TimeValue) % 1000000,DATEADD(MILLISECOND, DATEDIFF_BIG(MILLISECOND,'00:00:00', @TimeValue), CONVERT(datetime2(7),@DateValue)));
最后,是的,您可以将值转换为字符串,然后再转换为datetime2
值;这可能是最简单的方法。您只需要确保使用样式代码:
DECLARE @TimeValue time(7) = '17:52:12.1234567',
@DateValue date = '20211016';
SELECT CONVERT(datetime2(7),CONVERT(varchar(10), @DateValue, 23) + 'T' + CONVERT(varchar(17), @TimeValue, 114),126);
我有一个列类型 time(7)
。
我想要的是在时间列中添加日期。
我设法使用 GETDATE()
函数获得唯一的日期,但我无法在日期旁边添加时间部分。
查询:
SELECT [Compay]
,[Time]
,CAST(GETDATE() AS DATE) AS Today
,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) AS Today_AS_Nvarchar
,CAST([Time] AS NVARCHAR) AS Time_AS_Nvarchar
,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) + ' ' + CAST([Time] AS NVARCHAR) AS Today_Time_AS_Nvarchar
,CONVERT(datetime,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) + ' ' + CAST([Time] AS NVARCHAR),103)
FROM [Testing_Env].[dbo].[Com_CD_Test]
错误:
Conversion failed when converting date and/or time from character string.
错误发生在CONVERT(datetime,CAST(CAST(GETDATE() AS DATE) AS NVARCHAR) + ' ' + CAST([Time] AS NVARCHAR),103)
有什么easier/orthodox方法可以实现吗?
您不能像添加旧数据类型那样将新的日期和时间数据类型添加在一起;我个人认为这也更好,因为它阻止人们将日期和时间视为数值。
假设 你有一个 date
列和一个 time
列,你有几个选项。第一种是将 CAST
/CONVERT
都添加到 datetime
,然后将它们“相加”。因为“旧”数据类型的工作方式更像是数值,所以如果 time
的精度为 3
或更高(因为 datetime
是只精确到 1/300 秒):
DECLARE @TimeValue time(7) = '17:52:12.1234567',
@DateValue date = '20211016';
SELECT CONVERT(datetime, @DateValue) + CONVERT(datetime, @TimeValue);
如果不能选择降低准确性,那么您可以可以对date
值使用转换并使用DATEDIFF
和DATEADD
.对于 time(7)
,您需要使用纳秒(因为微秒不够准确)。不幸的是,这带来了另一个问题; DATEADD
无法处理 bigint
值(仍然)并且没有 DATEADD_BIG
(就像有 DATEDIFF_BIG
),所以这变得过于复杂。需要先求出毫秒差,然后加上纳秒的余数,仍然可以精确到1/1000000秒:
DECLARE @TimeValue time(7) = '17:52:12.1234567',
@DateValue date = '20211016';
SELECT DATEADD(NANOSECOND,DATEDIFF_BIG(NANOSECOND,'00:00:00', @TimeValue) % 1000000,DATEADD(MILLISECOND, DATEDIFF_BIG(MILLISECOND,'00:00:00', @TimeValue), CONVERT(datetime2(7),@DateValue)));
最后,是的,您可以将值转换为字符串,然后再转换为datetime2
值;这可能是最简单的方法。您只需要确保使用样式代码:
DECLARE @TimeValue time(7) = '17:52:12.1234567',
@DateValue date = '20211016';
SELECT CONVERT(datetime2(7),CONVERT(varchar(10), @DateValue, 23) + 'T' + CONVERT(varchar(17), @TimeValue, 114),126);