【问题标题】:Issues with converting a date in SQL Server在 SQL Server 中转换日期的问题
【发布时间】:2016-03-31 16:24:00
【问题描述】:

我的数据中有一个列充满了“日期”,其格式类似于030816,并且数据类型为 Varchar。我整个上午都在尝试将此数字转换为03/08/2016 的日期格式。我似乎没有做任何事情给我想要的结果。这是我尝试过的:

  • 我将列数据类型从 Varchar 更改为 Date。这导致了更可接受的日期格式,但也导致完全更改日期。在此转换后,本应为 03/08/2016 的日期最终变为 2003-08-16
  • 我尝试将数据类型保留为 Varchar,并在构建我的选择查询时使用 Convert(Varchar(10),Bill_Date,103),但这没有导致任何变化,并继续将结果显示为 030816
  • 我也尝试使用Cast(Bill_Date AS Date),但这也为我提供了2003-08-16 的结果,这又不是正确的日期。
  • 最后,我尝试了Format(Bill_Date,'MM/DD/YYYY'),但这给了我一条错误消息,声称 Argument 数据类型 Varchar 对于该参数无效。

有没有办法让 SQL 将此数字字符串转换为我需要的日期格式,或者至少有一种方法可以在选择查询中显示数字字符串,这将为我提供所需的格式?

【问题讨论】:

  • DATEDATETIME 数据类型没有格式,它们只是根据区域设置以某种方式显示结果。你真的想要DD/MM/YYYY 格式的varchar,还是实际的DATE?。你怎么知道03081603/08/2016 而不是03/08/191603/08/2116
  • 您是否尝试使用 SUBSTRING 来组成 ISO8601 格式的日期字符串?另见 CONVERT(datetime, @val, 126)
  • 那你就可以SELECT LEFT(YourColumn,2) + '/' + SUBSTRING(YourColumn,3,2) + '/20' + RIGHT(YourColumn,2)
  • 绝对最好的解决方法是停止将日期存储在 varchar 列中。将“日期”存储为 varchar 是令人难以置信的问题。有太多的事情可能会出错。然后你会遇到现在面临的挑战。如果将其存储为日期,则根本没有问题。当然,任何格式都真正属于前端,而不是 sql server。
  • @SeanLange 这就是我不想发布答案的原因 ;-)

标签: sql sql-server


【解决方案1】:
CREATE TABLE #Dates (D VARCHAR(20))

INSERT INTO #Dates
        (D)
VALUES  ('030816'),
        ('123049'),
        ('013055'),
        ('123099')

select convert (datetime,  Stuff(Stuff(d,5,0,'.20'),3,0,'.'))

FROM #Dates

DROP TABLE #Dates

如果您的某些日期早于 2000 年 1 月 1 日,您将需要对您的特定数据集进行数学运算,以将 '.20' 替换为 '19'

【讨论】:

    【解决方案2】:

    您需要将值转换为 日期,而不是日期:

    select Convert(date, Bill_Date, 3)
    

    适当的格式应该是“3”。

    如果之后需要字符串,可以使用 101 将其转换回 MM/DD/YYYY 格式。

    【讨论】:

    • 投反对票的原因?如果这是错误的,评论会很有帮助。
    • 不是我的反对意见,但您的查询给出的结果与 op 想要的结果不同,可能就是这样
    【解决方案3】:

    创建表样本数据( DescSample VARCHAR(10) )

    插入样本数据 值('030816')

    SELECT LEFT(DescSample, 2) + '/' + SUBSTRING(DescSample,3,2) + '/' + '20' + RIGHT(DescSample, 2)

    来自样本数据

    -- 就是你想要的格式 -- 你应该使用正确的年份格式。 -_-

    【讨论】:

    • -1。懒惰地复制/粘贴 12 小时前发布的答案。哦,只有代码部分——因为你甚至没有复制解释。
    • 至少有一种方法可以在选择查询中显示数字字符串,从而为我提供所需的格式? ——他这么说。我给了他在 sql 中使用 left right 的想法。
    猜你喜欢
    • 2019-08-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多