【问题标题】:Convert date format doesn't take effect on self made date string in SQL Server转换日期格式对 SQL Server 中的自制日期字符串不起作用
【发布时间】:2016-09-14 09:46:40
【问题描述】:

我有一个相当奇怪的问题。我有一个日期字符串,部分是我自己创建的,用于合并一个变量。问题是,我正在设置另一种语言设置。在这种情况下,我还必须转换字符串以适应语言设置格式。我正在使用此代码:

cast(convert(varchar, cast(cast(getdate() as date) as varchar) + ' ' + RIGHT('0' + CAST(@HR as varchar), 2) + ':00:00.000', 120) as datetime)

我收到错误“将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。”如果您在转换前分配了错误的日期格式,这是正常的。

问题是,当我尝试转换个人创建的日期字符串时,无论我设置什么格式代码,它都不会改变它的格式。即使我硬编码一个数字而不是我的变量:

convert(varchar, cast(cast(getdate() as date) as varchar) + ' 0' + CAST(2 as varchar) + ':00:00.000', 101)

结果于 2016-09-14 02:00:00.000

例如,

convert(varchar, dateadd(Hour, 2, getdate()), 101) as datetime

2016 年 9 月 14 日的结果。

即使我有不同的语言设置,SQL Server 不应该总是识别标准格式的日期格式吗?

请给我一个建议,以便我可以克服这个问题。

提前致谢!

PS:我设法通过在设置保加利亚语之前在变量中插入转换后的日期时间列来解决我的问题。不过,我仍然很想知道导致问题的原因。

【问题讨论】:

  • 使用DBCC USEROPTIONS,您可以检查数据库使用的日期格式。如果以前从未设置过,它会在您更改语言时更改。但是,一旦您设置了像SET DATEFORMAT DMY 这样的日期格式,如果您更改语言,日期格式将保持不变。有关这方面的更多信息,请参阅:msdn.microsoft.com/de-de/library/ms189491.aspx
  • 非常感谢。这将帮助我实现我的目标(我已经解决了),但仍然没有回答我的问题,这就是为什么转换为特定格式的数字不适用于我的字符串。
  • 你是对的,这不是你问题的答案。但也许我的回答对这个问题更有帮助。都是因为CONVERT里面的数据类型

标签: sql sql-server tsql date


【解决方案1】:

好的,我可能对这个问题有一个解决方案:为什么转换时在 SQL-SERVER 中处理的格式不同。

CONVERT(data_type(length),expression,style)

STYLE值仅适用于日期/时间。 所以这是因为输出不同的数据类型。 请参见以下示例:

SELECT convert(varchar, dateadd(Hour, 2, getdate()), 101) as datetime

你得到结果:

09/14/2016

在这里,您正在将 datetime 数据类型转换为 varchar,并且带有 101STYLE 值适用于 CONVERT,并且输出转换为该格式。

示例 2 相同,但最里面的部分在转换之前被转换为 varchar

SELECT convert(varchar, CAST(dateadd(Hour, 2, getdate()) AS varchar), 101) as datetime

你得到的结果是:

Sep 14 2016  4:09PM

所以因为我们试图将varchar 转换为varchar,所以STYLE-值不适用于转换。

这也是为什么第一个查询的处理方式与另一个查询不同的原因:

SELECT convert(varchar, cast(cast(getdate() as date) as varchar) + ' 0' + CAST(2 as varchar) + ':00:00.000', 101)

在这里,您在转换之前转换为varchar cast(cast(getdate() as date) as varchar)。所以STYLE-value 不适用,因为它不是来自数据类型日期/时间。

我希望它说得清楚一点。让我知道这是否有帮助。

【讨论】:

    【解决方案2】:

    当您使用 convert 格式化日期时间时,您可以将样式编号传递给它。
    看看herehere 这些数字。

    以下查询将自定义创建的日期时间转换为 126 (ISO8601) 格式。

    declare @d int = 2;
    
    SELECT 
    CONVERT(varchar,
            CONVERT(datetime,
                    CONCAT(FORMAT(GETDATE(),'yyyy-MM-dd'),' ',@d,':0')
                    )
             ,126) AS MyDateStamp1,
    CONVERT(varchar,
            CONVERT(datetime,
                    CONVERT(varchar,GETDATE(),102)+' '+convert(varchar,@d)+':0'
                    )
             ,126) AS MyDateStamp2;
    

    FORMAT & CONCAT 函数可用于 SQL Server 2012 及更高版本。
    但是,如果您有较早的版本,那么 CONVERT 应该可以代替。

    【讨论】:

    • 我的查询中已有格式样式编号。它不适用(至少不正确),这就是我问题的重点。无论如何,提醒我 FORMAT 功能非常有帮助。
    • 您的问题是您尝试将 varchar 转换为 varchar 格式。 select convert(varchar,'2001-01-01 01:01:00',101) 不会引发错误,但毫无意义。而在答案中,varchar 被转换为 datetime,然后 datetime 被转换为某种格式的 varchar。
    【解决方案3】:

    附加提示:

    如果您使用上面的 CONVERT 解决方案,请注意

    "convert(varchar, CAST(dateadd(Hour, 2, getdate()) AS varchar), 101)"

    要求您将数据类型设置为 varchar。

    我刚刚遇到了代码

    “转换(日期,ML.StartDate,101)”

    由于样式 101 是 mm/dd/yyyy,并且输出是 yyyy-mm-dd,我知道出了点问题。通过将代码更改为

    "转换(varchar,ML.StartDate,101)"

    结果集中显示了正确的日期样式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      相关资源
      最近更新 更多