【问题标题】:Out of range when converting data SQL Server转换数据 SQL Server 时超出范围
【发布时间】:2015-08-27 09:26:27
【问题描述】:

我有一个varchar 列,其中包含日期dd.mm.yyyy 之类的字符串,我需要将其转换为仅具有不同格式的相同字符串,例如yyyy.mm.ddT00:00:000

已解决:第一次测试:

SELECT REPLACE(CONVERT(varchar, CAST(table.DATE AS datetime), 126),'-','.') AS date 
FROM tabletest.DBO.TABLE

结果:

我得到 5 个值(超过 1000 个)和 msg:

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

已解决:第二次测试:

SELECT REPLACE(CONVERT(varchar, (RIGHT(GREMPG1.DAT,4)+SUBSTRING(GREMPG1.DAT,3,4)+LEFT(GREMPG1.DAT, 2) + ), 126),'-','.') AS Datums 
FROM tabletest.DBO.GREMPG1

找不到关于如何获得第二部分的解决方案。

也许有一些最短的方法来转换列记录格式?

谢谢。

已编辑:

第二个查询:

  • 旧值:01.03.2014
  • 新值:2014.03.01
  • 需要获取:2014.03.01T00:00:00

【问题讨论】:

  • 请发布一些示例数据
  • 那么您需要输出为 varchar 还是日期格式?
  • 尝试使用datetime2 而不是datetime。前者可以存储超出datetime范围的日期
  • SQL Server 的版本是什么?你有多少行?我想其中一个字符串是错误的。例如:30.02.2012。或者转换不正确尝试将15.02.2012 转换为mm.dd.yyyy
  • @elly,正如我在回答中所建议的那样,“只有前 5 个结果”可能意味着第六行包含错误数据......或者您的系统采用 mm.dd 而不是 dd.mm

标签: sql-server date type-conversion


【解决方案1】:

对于您的第一次测试,请尝试这种方式 -

SELECT REPLACE(CONVERT(varchar, CONVERT(datetime,table.DATE,103), 126),'-','.') AS date FROM tabletest.DBO.TABLE

第二次尝试 -

SELECT REPLACE(CONVERT(varchar, CAST((RIGHT(GREMPG1.DAT,4)+SUBSTRING(GREMPG1.DAT,3,4)+LEFT(GREMPG1.DAT, 2)) AS DATETIME), 126),'-','.') AS Datums FROM tabletest.DBO.GREMPG1

【讨论】:

  • 太棒了!这行得通。我以前是这样写的,但没有得到结果。谢谢。
  • 第二个 sql 怎么样?关于如何完成/继续/更改以使用 LEFT/RIGHT/SUBSTRING 的一些选项?
  • @elly - 您的源仅存储dd.mm.yyyy,所以当您尝试转换为yyyy.mm.ddT00:00:000 时,时间部分总是给您零,对吗?在这种情况下,只需在您的第二个查询之后附加 T00:00:000
  • 逻辑上。谢谢! :)
【解决方案2】:

使用这个:

SELECT REPLACE(CONVERT(varchar, CONVERT(datetime,'15.02.2012',104), 126),'-','.') AS date

你会得到关于你施放日期的信任。 15.02.2012 计算为 mm.dd.yyyy 并且因为没有第 15 个月,所以你会得到错误。

所以您的查询将如下所示:

SELECT 
    REPLACE(CONVERT(varchar, CONVERT(datetime,table.DATE,104), 126),'-','.') AS date 
FROM 
    tabletest.DBO.TABLE;

【讨论】:

  • 是的,谢谢,这对我有用。以前是这样做的,但没有结果。
  • 第二个有什么想法吗?
  • 不,发布您的原始查询。
  • 它是原始的。我没有别的了。我需要得到相同的结果。
【解决方案3】:

您的 SELECT 似乎有效。试试这个:

declare @d VARCHAR(100)='13.12.2015';
SELECT REPLACE(CONVERT(varchar, CAST(@d AS datetime), 126),'-','.') AS date
/*
Result: 2015.12.13T00:00:00
*/

如果它不起作用,我会认为是文化问题(日期格式的处理方式因系统语言和国家/地区而异)。

如果它有效,我会假设你的数据库中至少有一个值是坏的......

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多