我希望将将NVARCHAR转换为英国日期的用户输入
用户输入的最大长度始终为6位数字。
例如:
151119(DDMMYY)-> 15NOV19
120119(DDMMYY)-> 19年1月12日
答案 0 :(得分:2)
首先需要一个有效的DATE
或DATETIME
/ DATETIME2
值。您可以使用带有SELECT
的{{1}}查询来获得该值:
CONVERT
现在,您可以通过两种方法以预期的格式(SELECT CONVERT(DATE,
SUBSTRING('151119', 3, 2) + '-'
+ SUBSTRING('151119', 1, 2) + '-'
+ SUBSTRING('151119', 5, 2)
, 10);
)获取日期。
1-使用DATENAME
的解决方案:
DDMMMYY
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 DATENAME(DD, @dDateValue) +
UPPER(LEFT(DATENAME(MM, @dDateValue), 3)) +
RIGHT(DATENAME(YY, @dDateValue), 2);
注意:我建议将日期值存储在数据类型为-- 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), ' ', ''));
或DATE
的列上。您可以在应用程序上格式化日期值,也可以直接在SQL-Server上使用格式化函数。
答案 1 :(得分:2)
您需要将字符串更改为看起来几乎与普通日期格式相似的内容,然后可以使用convert:
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代表英国2位数格式(dd / mm / yy),您可以看到其他选择here。
答案 2 :(得分:1)
我强烈建议使用AS DATE或DATETIME类型的列上的日期值。这是您需要的简单实现:
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 |