我这里有个很奇怪的问题。我有一个日期字符串,部分是我自己创建的,用于合并一个变量。问题是,我正在设置另一个语言设置。在这种情况下,我还必须转换字符串以适应语言设置格式。我用的是这个代码:
cast(convert(varchar, cast(cast(getdate() as date) as varchar) + ' ' + RIGHT('0' + CAST(@HR as varchar), 2) + ':00:00.000', 120) as datetime)
我得到错误“将varchar数据类型转换为日期时间数据类型导致了超出范围的值”,如果在转换之前分配错误的日期格式,这是正常的。
问题是,当我试图转换个人创建的日期字符串时,它不会改变它的格式,不管我在哪种格式代码中设置它。即使当我硬编码一个数字而不是我的变量时,这种情况也不会改变:
convert(varchar, cast(cast(getdate() as date) as varchar) + ' 0' + CAST(2 as varchar) + ':00:00.000', 101)
2016年业绩-09-14 02:00:00.000
例如,
convert(varchar, dateadd(Hour, 2, getdate()), 101) as datetime
2016年9月14日的结果。
即使我有一个不同的语言设置,SQL server不应该总是以标准格式识别日期格式吗?
请给我一个建议,这样我就能克服这个问题。
提前感谢!
PS:在设置保加利亚语言之前,我通过在变量中插入转换后的datetime列来解决我的问题。不过,我还是很想知道是什么引起了这个问题。
发布于 2016-09-14 04:28:49
好的,我可能对这个问题有一个解决办法:为什么在转换时,这种格式在SQL-SERVER中有不同的处理方式。
CONVERT(data_type(length),expression,style)
STYLE
值仅适用于日期/时间。因此,由于数据类型的不同,输出是不同的。见以下示例:
SELECT convert(varchar, dateadd(Hour, 2, getdate()), 101) as datetime
你得到的结果:
09/14/2016
在这里,您将datetime
数据类型转换为varchar
,STYLE
-value和101
应用于CONVERT
,并且输出以该格式转换。
示例2是相同的,但内部大部分是在转换之前先转换到varchar
中的:
SELECT convert(varchar, CAST(dateadd(Hour, 2, getdate()) AS varchar), 101) as datetime
你得到的结果是:
Sep 14 2016 4:09PM
因此,由于我们试图将varchar
转换为varchar
,所以STYLE
-value不适用于转换。
这也是第一个查询被不同处理的原因:
SELECT convert(varchar, cast(cast(getdate() as date) as varchar) + ' 0' + CAST(2 as varchar) + ':00:00.000', 101)
在这里,您在转换之前转换为varchar
cast (强制转换(getdate()为date)为varchar)。因此,STYLE
-value没有应用,因为它不是来自数据类型日期/时间。
我希望这句话说得有点清楚了。如果这有帮助的话请告诉我。
发布于 2016-09-14 02:36:46
使用“转换”格式化日期时间时,可以向其传递样式编号。
下面的查询将自定义创建的日期时间转换为126 (ISO8601)格式。
declare @d int = 2;
SELECT
CONVERT(varchar,
CONVERT(datetime,
CONCAT(FORMAT(GETDATE(),'yyyy-MM-dd'),' ',@d,':0')
)
,126) AS MyDateStamp1,
CONVERT(varchar,
CONVERT(datetime,
CONVERT(varchar,GETDATE(),102)+' '+convert(varchar,@d)+':0'
)
,126) AS MyDateStamp2;
格式& CONCAT函数可以在Server 2012及以后使用。
但是,如果您有一个较早的版本,那么转换应该是有效的。
https://stackoverflow.com/questions/39487346
复制相似问题