【问题标题】:Convert to DATE T-SQL转换为 DATE T-SQL
【发布时间】:2017-06-26 14:42:08
【问题描述】:

我有一个日期格式为 dd.mm.yyyy E.x. 29.05.2016。我想将其选择为 DATE,但在尝试以下操作时出现错误:

CAST([PublishedDate] AS DATE) AS PublishedOn

从字符串转换日期和/或时间时转换失败。

阅读this我尝试了以下:

 CONVERT(VARCHAR(10), [PublishedDate], 126)  AS PublishedDate

但它不会改变格式。 如何选择 YYYY-MM-DD 格式。

编辑:我有 3 个不同的日期字段,所有三个具有不同的格式:dd.mm.yyyy | yyyy-mm-dd |年年/月/日。我想以相同的格式选择所有这些。由于我使用此查询来构建报告,因此现在我有不同格式的日期。执行以下操作:

CONVERT(VARCHAR(10), [PublishedDate], 104) AS PublishedOn
CONVERT(VARCHAR(10), [ValidFromDate], 104)  AS ValidFrom

给我以下

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    你应该使用正确的format,在你的情况下是:

    CONVERT(date, [PublishedDate], 104)  AS PublishedDate
    

    此外,一旦它是 datedatetime 或其他日期数据类型,它就根本没有格式。

    编辑:一旦你的值在 date 数据类型中,你当然可以重铸为 varchar 以获得你需要的日期的可视化表示。

    edit2:如果您想要date 数据类型,您应该转换为日期:CONVERT(DATE, [your column], [your format])。 如果你想要一个nvarchar 数据类型,你应该转换为nvarchar:CONVERT(nvarchar(x), [your column], [your format])

    你有一个nvarchar,你想以某种格式显示,所以你应该先转换为日期,然后再转换回varchar(我怀疑你需要unicode):

    CONVERT(VARCHAR(10), CONVERT(date, [PublishedDate], 104), 126)
    

    104 对于当前采用不同格式的列,您必须更改。

    目前最好的解决方案是将数据类型更改为date。这有点工作,但绝对值得。

    【讨论】:

    • 那是因为您的本地设置告诉 sql-server 以该格式显示它。您正在查看日期数据类型的字符串表示。在内部,日期以一种非常不同的、无格式的方式存储。
    • 我有 3 个不同的日期字段,所有 3 个都以不同的方式显示它们
    • 那么它们并不都在date数据类型中,它们中的一些或全部可能是varcharchar。顺便说一句,将日期存储在字符串数据类型中是不好的设计。始终使用适当的数据类型。
    • 如果date 数据类型没有格式,那么为什么我会得到不同的格式(在我的编辑中)。我正在将它们都转换为日期。
    • 在您的编辑中,您将它们转换为varcharPublishedDateValidFromDate 的数据类型什么?如果您只选择它们而不进行任何转换,它们会是什么样子?
    【解决方案2】:

    如果你真的想要字符串这样做:

    CONVERT(char(10), CONVERT(date,[date], 104),126)  AS PublishedDate
    

    将字符串转换为日期,使用 104 格式 (dd.mm.yyyy),因为它是您的原始格式,然后将日期转换为字符串,使用 126 格式 (yyy-mm-dd)

    【讨论】:

    • 我收到以下错误:从字符串转换日期和/或时间时转换失败。
    【解决方案3】:

    如果你有更新版本的 SQL Server,你可以试试

    SELECT COALESCE(TRY_CAST(adate AS DATE), TRY_convert(DATE, adate, 126), TRY_convert(DATE, adate, 104)), format
    FROM (
    VALUES ('26.04.2017', 'dkformat') , 
    ('01.01.2017', 'EU format'), 
    ('12.12.12', 'unknown format')
    ) a(aDate, format)
    

    但是当你试图猜测你的源是什么格式时,你正走在一条危险的道路上。去过那里,做到了,有 T 恤。

    我仍然讨厌 0.1% 的错误转化率。

    此解决方案将导致 NULL,因此您可以查看转换失败的位置。

    【讨论】:

      猜你喜欢
      • 2013-11-08
      • 1970-01-01
      • 2016-05-03
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      相关资源
      最近更新 更多