将 NVARCHAR 转换为英国日期

Converting a NVARCHAR into a UK date

我希望将 NVARCHAR 类型的用户输入转换为英国日期

用户的输入总是最多6位。

例如:

151119 (DDMMYY) --> 15NOV19

120119 (DDMMYY) --> 12JAN19

您首先需要一个有效的 DATE or DATETIME / DATETIME2 值。您可以使用此 SELECT 查询和 CONVERT:

来获取此值
SELECT CONVERT(DATE, 
  SUBSTRING('151119', 3, 2) + '-'
  + SUBSTRING('151119', 1, 2) + '-'
  + SUBSTRING('151119', 5, 2)
, 10);

现在您有两种可能性来获取预期格式的日期 (DDMMMYY)。

1 - 使用 DATENAME 的解决方案:

-- set the date value (from custom date value).
DECLARE @dDateValue AS DATE = CONVERT(DATE, 
  SUBSTRING('150419', 3, 2) + '-'
  + SUBSTRING('150419', 1, 2) + '-'
  + SUBSTRING('150419', 5, 2)
, 10);

-- format the date value to the expected format.
SELECT DATENAME(DD, @dDateValue) + 
  UPPER(LEFT(DATENAME(MM, @dDateValue), 3)) + 
  RIGHT(DATENAME(YY, @dDateValue), 2);

2 - 使用 CONVERT 的解决方案:

-- set the date value (from custom date value).
DECLARE @dDateValue AS DATE = CONVERT(DATE, 
  SUBSTRING('150419', 3, 2) + '-'
  + SUBSTRING('150419', 1, 2) + '-'
  + SUBSTRING('150419', 5, 2)
, 10);

-- format the date value to the expected format.
SELECT UPPER(REPLACE(CONVERT(VARCHAR, @dDateValue, 6), ' ', ''));

demo on dbfiddle.uk


注意: 我建议将日期值存储在数据类型为 DATEDATETIME 的列中。您可以在应用程序上格式化日期值或直接在 SQL-Server 上使用格式化函数。

您需要将字符串更改为看起来更像普通日期格式的内容,然后您可以使用转换:

declare @textDate nvarchar(6) = '120119';

select @textDate
    , stuff(stuff(@textDate, 3,0,'/'), 6,0,'/')
    , convert(date, stuff(stuff(@textDate, 3,0,'/'), 6,0,'/'), 3);

给出:120119,12/01/19,2019-01-12 由于最后一个是有效的日期数据类型,您现在可以使用 Format().

虽然显然 2 位数年份首先不是一个好主意。

忘了说了,3是UK 2 digit format(dd/mm/yy),其他的可以看here.

我强烈建议使用 AS DATE 或 DATETIME 类型的列上的日期值。这是满足您需要的简单实现:

SQL Fiddle

MS SQL Server 2017 架构设置:

create table test (mydate nvarchar(6))
insert into test (mydate)values('151119')
insert into test (mydate)values('120119')

查询 1:

select FORMAT(CONVERT(DATE, dates), 'dd/MM/yyyy ')   from (select left(mydate,2)
+ 
CASE  SUBSTRING(mydate, 3, 2)
       WHEN '01' THEN 'JAN'
       WHEN '02' THEN 'FEB'
       WHEN '03' THEN 'MAR'
       WHEN  '04' THEN 'APR'
       WHEN '05' THEN 'MAY'
       WHEN '06' THEN 'JUN'
       WHEN '07' THEN 'JUL'
       WHEN '08' THEN 'AUG'
       WHEN '09' THEN 'SEP'
       WHEN '10' THEN 'OCT'
       WHEN '11' THEN 'NOV'
       WHEN '12' THEN 'DEC'
       ELSE 'error'
END
+ right(mydate,2) AS 'dates'
from test ) AS T

Results:

|             |
|-------------|
| 15/11/2019  |
| 12/01/2019  |