Return 与输入格式相同的新日期字符串
Return new date string in the same format as input
我有两列:带有输入日期的 varchar 列 InputValue(所有字符串都通过 IsDate(InputValue)=1 验证)和日期时间列 NewDate 新日期。如何 return 新日期作为与输入日期格式相同的字符串?示例(我需要 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)?或者,也许您有任何自定义代码来尽可能接近结果?
谢谢!
嗯,为所有可能的日期格式编写规则是一项艰巨的任务,但如果您只是想要这些并且完全出于您自己的原因,可以使用 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
您可以使用 TRY_CONVERT
尝试使用各种样式进行转换,然后将值转换回来并比较它以查看样式是否匹配。另见 the documentation。
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)
It goes without saying that this type of table design is really bad.
我有两列:带有输入日期的 varchar 列 InputValue(所有字符串都通过 IsDate(InputValue)=1 验证)和日期时间列 NewDate 新日期。如何 return 新日期作为与输入日期格式相同的字符串?示例(我需要 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)?或者,也许您有任何自定义代码来尽可能接近结果? 谢谢!
嗯,为所有可能的日期格式编写规则是一项艰巨的任务,但如果您只是想要这些并且完全出于您自己的原因,可以使用 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
您可以使用 TRY_CONVERT
尝试使用各种样式进行转换,然后将值转换回来并比较它以查看样式是否匹配。另见 the documentation。
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)
It goes without saying that this type of table design is really bad.