在我的 Microsoft SQL Server 資料庫中,每個日期或日期時間都表示為一個decimal(17,0)值。
例如: 20210722054500000 將轉換為 2021-07-22 05:45:00:000
我已經想出了一個解決方案來轉換這個:
SELECT
CONVERT(datetime, (SUBSTRING(CAST(20210722054500000 AS varchar(20)), 1, 4) '-'
SUBSTRING(CAST(20210722054500000 AS varchar(20)), 5, 2) '-'
SUBSTRING(CAST(20210722054500000 AS varchar(20)), 7, 2) ' '
SUBSTRING(CAST(20210722054500000 AS varchar(20)), 9, 2) ':'
SUBSTRING(CAST(20210722054500000 AS varchar(20)), 11, 2) ':00'), 120)
它有效,但我覺得應該有更好的解決方案來轉換它。
所以我的問題是有沒有一種方法需要更少的代碼或者在性能方面會更好?
uj5u.com熱心網友回復:
一種方法是使用一組簡單的子串來提取部分。鑒于此表和資料:
CREATE TABLE dbo.WhoDesignedThis
(
Id int,
TheDate decimal(17,0) -- this was hard to write with a straight face
);
INSERT dbo.WhoDesignedThis(Id, TheDate) VALUES
(1, 20210722054500000),
(2, 19991231132247699);
這個查詢:
;WITH x AS
(
SELECT Id, TheDate, x = CONVERT(char(17), TheDate)
FROM dbo.WhoDesignedThis
)
SELECT Id, TheDate, output = DATETIMEFROMPARTS
(
LEFT(x,4),
SUBSTRING(x,5,2),
SUBSTRING(x,7,2),
SUBSTRING(x,9,2),
SUBSTRING(x,11,2),
SUBSTRING(x,13,2),
RIGHT(x,3)
)
FROM x;
產生這些結果:
| ID | 日期 | 輸出 |
|---|---|---|
| 1 | 20210722054500000 | 2021-07-22 05:45:00.000 |
| 2 | 19991231132247699 | 1999-12-31 13:22:47.700 |
- 示例資料庫<>小提琴
uj5u.com熱心網友回復:
您可以使用 datetimefromparts 在沒有強制轉換和字串函式的情況下執行此操作:
declare @input decimal(17,0) = 20210722054500000
select DATETIMEFROMPARTS(
@input/10000000000000 ,-- year
@input/100000000000 % 100 ,-- month
@input/1000000000 % 100 ,-- day
@input/10000000 % 100 ,-- hour
@input/100000%100 ,-- minute
@input/1000%100 ,-- seconds
@input%1000 -- milliseconds
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/337176.html
標籤:sql-server 表现 查询优化
上一篇:優化mySQL查詢以更好地擴展
