我有一个将字符串日期转换为日期格式的方案。但是日期字符串不是直接格式,因此转换将引发错误。所以我尝试的是
set dateformat dmy
在进行sql转换之前,它没有任何问题。
但是麻烦的是我需要在视图或函数中实现它。但是令人失望的部分,功能或视图不支持设置日期格式,它表示为副作用运算符
那么在转换为函数或视图之前,如何指定给定字符串的日期格式?
答案 0 :(得分:0)
就像达米安(Damien)在对问题的评论中所写的那样,理想情况下,您首先不应该弄乱日期时间的字符串表示形式-您应该使用正确的数据类型-并且由于您询问创建视图,所以它只能意味着在数据库中的某个地方,有一个datetime值存储为字符串。
解决此问题的方法是更改存储此值的方式-将DateTime2
用作日期时间值,将Date
用作仅日期值,将Time
用作一天中的时间值
进一步阅读-亚伦·伯特兰德(Aaron Bertrand)的Bad habits to kick : choosing the wrong data type
假设您无法更改数据库设计,请阅读此答案的其余部分。
您不能在视图或函数上使用set dateformat
,但是可以使用convert
代替cast
来将datetime
值的字符串表示形式更改为实际的datetime
值,假设字符串表示形式具有supported date formats中的一个(其中有很多,因此通常应该没有问题)。
如果datetime
的字符串表示形式不受内置convert
函数支持的格式的影响,则可能需要以字符串操作的形式做一些额外的工作来改变将其转换为受支持的格式,或者(在较困难的情况下)将字符串表示形式分成多个部分,然后使用datetimefromparts.
如果您可以提供datetime
格式的字符串表示形式中所使用的实际格式,我可能可以编辑此答案以向您显示确切的操作方法。
答案 1 :(得分:0)
第三个parameter of CONVERT()
允许提供格式类型。
假设您的SET DATEFORMAT DMY
使您不得不处理“ 1/2/2000”之类的日期,即2000年2月1日。
尝试一下:
DECLARE @d VARCHAR(100)='1/2/2000';
SELECT CONVERT(DATE,@d,104)
104
是德语类型,带有4位数字的年份。如果这不符合您的需求,则可以通过该链接找到更合适的格式。
如果您需要进一步的帮助,请提供实际日期的示例。
提示:您应始终将值存储在具有适当类型的列中。将日期存储为字符串会使事情变慢,并打开许多错误源...
答案 2 :(得分:0)
SELECT CONVERT(varchar(10),CAST('07/01/2018' AS DATE),23)
结果
2018-07-01
答案 3 :(得分:0)
不确定“日期字符串不是直接格式”是什么意思。例子会有所帮助。 您是否尝试过解析而不是强制转换?
SELECT
TRY_PARSE(thedate AS datetime) as justParse
,TRY_PARSE(thedate AS datetime USING 'en-US') as parseUS
,TRY_PARSE(thedate AS datetime USING 'en-GB') as parseGB
,try_cast(thedate as date) as tryCast
FROM (values
('07/01/2018')
,('01/07/2018')
,('07 jan 2018')
,('jan 07 2018')
,('Monday, 7 January 2019')
)d(thedate)