【发布时间】:2019-11-15 14:25:31
【问题描述】:
我希望将用户输入的 NVARCHAR 转换为英国日期
用户的输入将始终最多为 6 位数字。
例如:
151119 (DDMMYY) --> 15NOV19
120119 (DDMMYY) --> 12JAN19
【问题讨论】:
-
不难,但乏味。 T-SQL 中没有任何内容可以为您提供月份名称,因此您需要
SUBSTRING和一大堆CASE ... WHEN '01' THEN 'JAN' WHEN '02' THEN 'FEB' ... END。当然,一般来说,您最好使用像yyyy-MM-dd这样的明确格式,将日期存储为DATE列并将格式留给客户端。 -
@JeroenMostert -
DATENAME和FORMAT都可以提供月份名称 -
@MartinSmith:我说完就想到了
FORMAT,但我从来没有用过DATENAME。 (鉴于其特定于文化的输出,现在我知道了,我永远不会知道。但是,嘿,它是一些东西。) -
是的,这就是为什么你真的想在
DATE列中存储日期。虽然您可以将字符串转换为DATE((通过适当的应用STUFF和CONVERT)然后FORMAT它,这比仅仅做一个子字符串和CASE舞蹈更加笨拙和迂回。有还有两位数年份不明确的问题。SELECT UPPER(FORMAT(CONVERT(DATE, STUFF(STUFF('151119', 3, 0, '-'), 6, 0, '-'), 5), 'ddMMMyy', 'en-GB'))看起来对你有吸引力吗?对我来说看起来很可怕。 -
不要允许这样的输入开始。到底19是哪一年?所有 UI 平台都有日期选择器,所有语言都支持日期类型。即使你说
cutoff year,未来也会发生变化。如果您在谷歌上搜索15 november 1919,您会发现许多网站都存储了此类日期,并且可以告诉您,例如红军于 1919 年 11 月 14 日攻占鄂木斯克
标签: sql-server tsql date ssms