我有兩列:帶有輸入日期的 varchar 列InputValue(所有字串都通過 IsDate(InputValue)=1 驗證)和帶有新日期的datetime 列NewDate 。如何以與輸入日期相同的格式將新日期作為字串回傳?示例(我需要OutputValue包含NewDate值并以與InputValue相同的方式格式化):
InputValue NewDate OutputValue
(varchar) (datetime) (varchar)
20010101 02/02/2002 20020202
01-01-2000 12/25/2001 12-25-2001
Aug 12 2012 11/15/2000 Nov 15 2000
有什么方法可以找出輸入日期的樣式,所以我可以使用 CONVERT(varchar, NewDate, @inputStyle) 嗎?或者,也許您有任何自定義代碼來盡可能接近結果?謝謝!
uj5u.com熱心網友回復:
您可以使用TRY_CONVERT各種樣式嘗試轉換,然后將值轉換回來并比較它以查看樣式是否匹配。另請參閱檔案。
DECLARE @T TABLE (InputValue varchar(30), NewDate date, ExpectedValue varchar(30));
INSERT INTO @T VALUES
('20010101', '02/02/2002', '20020202'),
('01-01-2000', '12/25/2001', '12-25-2001'),
('Aug 12 2012', '11/15/2000', 'Nov 15 2000');
SELECT *,
OutputValue = (
SELECT TOP (1)
OutputValue = CONVERT(varchar(30), t.NewDate, v.style)
FROM (VALUES
(0),(110),(112)
) v(style)
WHERE t.InputValue = CONVERT(varchar(30), TRY_CONVERT(date, t.InputValue, v.style), v.style)
)
FROM @T t;
我只添加了三種樣式。如果您認為它們可能相關,您可以添加所有這些
FROM (VALUES
(0),(1),(2),(3),(4),(5),(6),(7),(8),(24),(10),(11),(12),(13),(14),(20),(21),(22),(100),(101),(102),(103),(104),(105),(106),(107),(108),(9),(110),(111),(112),(113),(114),(120),(25),(121),(23),(126),(127),(130),(131)
) v(style)
不用說,這種型別的桌子設計真的很糟糕。
uj5u.com熱心網友回復:
好吧,為所有可能的日期格式撰寫規則將是一項艱巨的任務,但是如果您只是想要這些并且出于您自己的原因,可以使用 iif 函式來完成:
DECLARE @T TABLE (InputValue varchar(20), NewDate date, OutputValue varchar(20))
INSERT INTO @T SELECT '20010101', '02/02/2002', '20020202'
INSERT INTO @T SELECT '01-01-2000', '12/25/2001', '12-25-2001'
INSERT INTO @T SELECT 'Aug 12 2012', '11/15/2000', 'Nov 15 2000'
select InputValue
, NewDate
, OutputValue
, iif(len(InputValue) = 8, convert(varchar(20), NewDate, 112)
, iif(InputValue LIKE '[A-Za-z]%', convert(varchar(20), NewDate, 107)
, convert(varchar(20), NewDate, 32))) derived
from @t
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/448072.html
