我有一個列型別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)
有沒有更簡單/正統的方法來實作它?
uj5u.com熱心網友回復:
您不能像舊資料型別一樣將新的日期和時間資料型別添加在一起;我個人認為這也更好,因為它阻止人們將日期和時間視為數值。
假設您有一個date列和一個time列,您有幾個選項。第一個是將CAST/CONVERT兩者都datetime添加到 a然后將它們“添加”在一起。因為“舊”資料型別的作業方式更像數值,因此,time如果它的精度為3或更高(因為datetime僅精確到 1/300 秒),您將失去您的值的準確性:
DECLARE @TimeValue time(7) = '17:52:12.1234567',
@DateValue date = '20211016';
SELECT CONVERT(datetime, @DateValue) CONVERT(datetime, @TimeValue);
如果失去準確性不是一種選擇,那么您可以對date值使用轉換并使用DATEDIFFand DATEADD。對于 atime(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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332841.html
上一篇:SQL運行總數達到X
下一篇:htaccess測驗工具的準確性
