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.