Sql 将NVARCHAR转换为DATETIME并选择不同的年份
上述sql查询产生此错误:Sql 将NVARCHAR转换为DATETIME并选择不同的年份,sql,sql-server,Sql,Sql Server,上述sql查询产生此错误: SELECT DISTINCT YEAR(convert(varchar(max),OrderCreatedDate)) from webshop 数据库中的值为NVARCHAR,格式如下:DD/MM/YYYY 00:00:00 AM(/PM) 我只想选择该年的唯一值 谢谢你的帮助试试这个 Conversion failed when converting date and/or time from character string. select distin
SELECT DISTINCT YEAR(convert(varchar(max),OrderCreatedDate)) from webshop
数据库中的值为NVARCHAR,格式如下:DD/MM/YYYY 00:00:00 AM(/PM)
我只想选择该年的唯一值
谢谢你的帮助试试这个
Conversion failed when converting date and/or time from character string.
select distinct year(CONVERT(NVARCHAR(255),CONVERT(SMALLDATETIME, columnName,105)))
DD/MM/YYYY 00:00:00 AM(/PM)
是英国格式。请参见试试这个
select distinct year(CONVERT(NVARCHAR(255),CONVERT(SMALLDATETIME, columnName,105)))
DD/MM/YYYY 00:00:00 AM(/PM)
是英国格式。请参见为避免此类问题,日期应保存在日期时间类型字段中,而不是字符串字段中
Year()
函数参数是DateTime类型
而不是字符串
。因此,您应该确保要传递的字符串可以转换为DateTime类型。在这种情况下,您可以使用Left()函数修剪时间部分,并使用103
样式,如下所示
SELECT DISTINCT YEAR(Convert(datetime,OrderCreatedDate,103)) from webshop
更新:
如果您遇到错误,可能是由于您的日期格式。i、 e.您保存的字符串的格式可能与问题中所述的格式不同(DD/MM/YYYY 00:00:00 AM(/PM)
)
在转换为日期之前,请使用ISDATE()
函数进行检查,确定哪些记录导致了问题,并进行纠正
尝试此查询以获取所有具有无效字符串的字符串。以下查询将为格式无效的值返回0
--Example
declare @val nvarchar(50) = '28/10/2013 11:25:45 AM (/PM)'
select year(convert(date,left(@val,10),103)) myYear
--Applying to your query
SELECT DISTINCT Year(Convert(Date,Left(OrderCreatedDate,10),103)) FROM Webshop
或者,您可以只获取导致问题的记录,如:
SELECT DISTINCT CASE WHEN IsDate(eft(OrderCreatedDate,10))=1 THEN
Year(Convert(Date,Left(OrderCreatedDate,10),103))
ELSE 0 END as myDate,
OrderCreatedDate
FROM Webshop
为避免此类问题,日期应保存在DateTime类型字段中,而不是字符串字段中
Year()
函数参数是DateTime类型
而不是字符串
。因此,您应该确保要传递的字符串可以转换为DateTime类型。在这种情况下,您可以使用Left()函数修剪时间部分,并使用103
样式,如下所示
SELECT DISTINCT YEAR(Convert(datetime,OrderCreatedDate,103)) from webshop
更新:
如果您遇到错误,可能是由于您的日期格式。i、 e.您保存的字符串的格式可能与问题中所述的格式不同(DD/MM/YYYY 00:00:00 AM(/PM)
)
在转换为日期之前,请使用ISDATE()
函数进行检查,确定哪些记录导致了问题,并进行纠正
尝试此查询以获取所有具有无效字符串的字符串。以下查询将为格式无效的值返回0
--Example
declare @val nvarchar(50) = '28/10/2013 11:25:45 AM (/PM)'
select year(convert(date,left(@val,10),103)) myYear
--Applying to your query
SELECT DISTINCT Year(Convert(Date,Left(OrderCreatedDate,10),103)) FROM Webshop
或者,您可以只获取导致问题的记录,如:
SELECT DISTINCT CASE WHEN IsDate(eft(OrderCreatedDate,10))=1 THEN
Year(Convert(Date,Left(OrderCreatedDate,10),103))
ELSE 0 END as myDate,
OrderCreatedDate
FROM Webshop
为什么人们显然不愿意使用正确的date[time]
数据类型?为什么你不能为这些字段设置时间戳?为什么人们显然不愿意使用正确的date[time]
数据类型?为什么你不能为这些字段设置时间戳?谢谢你的回复,我现在得到这个错误“将nvarchar数据类型转换为smalldatetime数据类型导致值超出范围”。有什么想法吗?感谢您的回复,我现在得到这个错误“将nvarchar数据类型转换为smalldatetime数据类型导致值超出范围”。有什么想法吗?我想保留英国格式,不过,感谢您的建议,我得到了这个错误“将nvarchar数据类型转换为datetime数据类型导致值超出范围。”这个错误可能是由坏数据造成的。我想并非所有数据都是正确的dd/mm/yyyy格式。我确实希望保留英国格式,感谢您的建议。但是,我收到了以下错误:“将nvarchar数据类型转换为datetime数据类型导致值超出范围。”此错误可能是由于数据错误造成的。我想并非所有数据都是正确的dd/mm/yyyy格式。谢谢您的回复和详细信息!我已尝试过查询,但我发现此错误“从字符串转换日期和/或时间时转换失败”。很高兴为您提供帮助。谢谢您的回复和详细信息!我已经尝试了这个查询,我得到了这样一个错误“从字符串转换日期和/或时间时转换失败。”。