【问题标题】:SQL Server date conversion - yyyy-dd-mm hh:mm:ss to yyyy-mm-dd hh:mm:sSQL Server 日期转换 - yyyy-dd-mm hh:mm:ss 到 yyyy-mm-dd hh:mm:s
【发布时间】:2013-09-24 14:46:55
【问题描述】:

你知道我如何在 SQL Server 2008 中将 yyyy-dd-mm hh:mm:ss 转换为 yyyy-mm-dd hh:mm:ss 吗?

我尝试了SELECT convert(varchar, StateChangeTime, 120) from History,但它无法区分 9 号作为一个月和一天之间的差异,因此什么也没做。 stateChangeTime 是一个 dateTime2

我要转换的示例日期2013-03-09 19:29:25 应该是2013-09-03 19:29:25

救命!

【问题讨论】:

  • 我在这里遗漏了一些东西。如果您调用CONVERT() 函数要求字符串类型的输出,如varchar,那么它需要一个日期类型的输入,如日期时间。但是你说的StateChangeTime 也是一个varchar。要么将日期值存储为字符串(不要那样做!),要么你对日期时间值的实际存储方式感到困惑。日期时间值以不可读的二进制格式存储,并且仅以您可以通过查询工具读取的方式显示。
  • SQL Server 识别的任何格式中都没有 yyyy-dd-mm 格式,因此您需要将组件中的字符串切分并重新排列。
  • stateChangeTime 是 dateTime2 类型,更新问题
  • @Guffa- 好的,我从解释奇怪格式的 excel 文件中填充了表格,你能告诉我如何将它切碎并重新排列吗??

标签: sql sql-server-2008 datetime casting


【解决方案1】:
  1. 这是我的理解:您的源存储为VARCHAR 格式(而不是datetime)。
  2. 您想将该自定义格式的字符串源转换为可解析的格式。

试试这些 ms-SQL 语句:

/*****
Your Source is in a custom-format string */
DECLARE @vsInpYYYYDDMM varchar(64)
SET @vsInpYYYYDDMM = '2013-03-09 19:29:25'

/*****
Convert that source YYYY-DD-MM format to YYYY-MM-DD format */
DECLARE @vsActualYYYYMMDD varchar(64)
SET @vsActualYYYYMMDD = substring( @vsInpYYYYDDMM, 1,4) + '-' + substring( @vsInpYYYYDDMM, 9, 2) + '-' + substring(@vsInpYYYYDDMM, 6, 2) + ' ' + substring(@vsInpYYYYDDMM,12,99)

PRINT @vsActualYYYYMMDD + ' is a String'

/*****
Convert that into an actual DATETIME variable */
DECLARE @dtDateVar as datetime
SET @dtDateVar = CONVERT( datetime, @vsActualYYYYMMDD, 120)
PRINT CONVERT(varchar, @dtDateVar, 120) + ' is a DateTime'

【讨论】:

    【解决方案2】:

    您如何在 SQL Server 中存储日期?它是datetime 列类型吗?如果是,则格式将按照向您显示的方式应用(由于区域设置)。

    121 formatter 选项会将其作为您想要的格式的字符串返回。

    SELECT convert(nvarchar, getdate(), 121)
    --returns 2013-09-24 15:51:14.363
    

    另一方面,如果它被存储为字符串,那么您将需要对其进行一些字符串操作。

    【讨论】:

    • 如果日期存储为字符串,您可以尝试将字符串转换或转换为datetime,然后按照此答案中的说明使用convert 函数。
    • 是的,但是如果它是一个字符串,并且由于客户端上的某些内容而被存储为 yyyy-dd-mm,并且服务器区域设置为 yyyy-mm-dd,那么服务器将解析该字符串,并将 mm 和 dd 转置为 8 月 9 日和 9 月 8 日。
    • 我不知道为什么这被否决了,这是我希望找到的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多