SQL Server中的日期转换不断失败

时间:2016-11-21 18:03:36

标签: sql sql-server tsql date

我在表格中有一个日期列(格式yyyymmdd),但它存储为nvarchar。我尝试将其转换为date并使用以下任一脚本进行清理:

convert(varchar(10), cast(ltrim(rtrim(replace([mydate], ''"'', ''''))) as datetime), 112) [mydate]

convert(nvarchar, cast(ltrim(rtrim(replace([mydate], ''"'', ''''))) as datetime), 112) [mydate]

该表包含数万行。

我经常收到以下错误:

  

将nvarchar数据类型转换为日期时间数据类型会导致超出范围的值。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

ContT

John提供了一些很好的信息,但我想我会为你扩展一点。

  • 首先要知道你需要SQL 2012+用于TRY_CONVERT()和FORMAT(),这些也是通过SQL调用的.Net函数,因此当应用于更大的数据集时,它们可能会导致性能不佳。
  • IsDate()函数是一个SQL函数,它不会产生巨大的性能影响,并会告诉您SQL是否可以将字符串解释为合法日期。 https://msdn.microsoft.com/en-us/library/ms187347.aspx
  • 接下来日期数据类型没有固有格式mm / dd / yyyy,yyyymmdd等格式,具体取决于您计算机的区域设置和设置在SSMS中,要表示为字符串,您可以将其转换/转换回您想要的内容。
  • 第四,也许最重要的是,您收到的错误表明您在该列中有错误的数据,实际上并不是yyyymmdd格式,或者是一个不正确的日期,例如我的例子中的2/30/2016,因为没有30天二月。
  • 最后,如果您要转换,我建议您存储并保持转换作为架构更改的一部分,如果您被允许的话。因为将日期存储为文本实际上是一个坏主意,例如您收到的错误以及根据范围等进行过滤的方法,您总是必须转换为查询费用更高的日期。

答案 1 :(得分:0)

我怀疑你可能在想这个

Declare @String nvarchar(25) = '20161121'
Select cast(@String as date)

返回

2016-11-21

答案 2 :(得分:0)

SQL中的简单日期转换方法:

DECLARE @datevar VARCHAR(8) 

SET @datevar = '20161122' 
SELECT REPLACE(CONVERT(DATE, @datevar, 112),'-','')

答案 3 :(得分:0)

正如您所说,您的日期格式为" yyyymmdd "。您在查询中使用112代码进行日期转换,这也是正确的,因为它接受日期" yyymmdd "格式。所以查询没有问题。

但是如果转换方法中的输入数据错误则会产生问题。例如

如果我在查询下运行。它工作正常,因为dd = 11和mm = 22,格式正确。

for connectedPeer in self.connectedPeers {
       let sendingProgress = self.session.sendResourceAtURL(newPhotoUrl!, withName: "Image1", toPeer: connectedPeer, withCompletionHandler: { (error) in
            if error != nil {
                print("sending failed \(error!.localizedDescription) - \(connectedPeer.displayName)")
            }
     })
      sendingProgress.addObserver(self, forKeyPath: "fractionCompleted", options: .New, context: nil)
    }

但如果我的查询是这样的话。在这里,我把22放在mm。这会产生一个问题,因为mm的最大值是12.

select convert(varchar(10), cast(ltrim(rtrim(replace('20161122', '"', ''))) as datetime), 112) [mydate]

所以查询没有问题。该问题是由于该表中的错误数据而生成的。

希望这会对你有所帮助:)。