【问题标题】:SQL Server 2012 : Convert 12Hr AM/PM nchar to 24Hr DateTime FormatSQL Server 2012:将 12Hr AM/PM nchar 转换为 24Hr DateTime 格式
【发布时间】:2017-09-18 16:20:24
【问题描述】:

第一个帖子/问题在这里。我正在尝试将 nchar 转换为日期时间。我查找的所有示例都显示从 24 转换为 12 小时,或者仅处理时间而不是转换的完整日期。我不是 SQL 的本地人,我仍在学习基础知识,因此不胜感激。

我有一个从批量插入的 .txt 文件中读取的具有这种格式的表格。

警报是 nchar 的文本,

AlarmTime 也是我从文本文件中读取的日期的 nchar。

Alarm    |    AlarmTime
  1      |      7/6/2016 10:10:42 AM
  2      |      7/10/2016 6:41:23 PM
  3      |      8/4/2016 4:35:53 PM

我想把它变成日期时间格式,而不是存储为 nchar。 每当我尝试转换时,都会出现错误: 从字符串转换日期和/或时间时转换失败。

我正在寻找的结果是这只是存储为日期时间:

    Alarm    |    AlarmTime
      1      |      7/6/2016 10:10:42 
      2      |      7/10/2016 18:41:23 
      3      |      8/4/2016 16:35:53 

我考虑过使用分隔符将日期和时间分隔为单独的列,然后稍后将它们重新组合在一起。或者使用 PM 添加时间,然后将列转换为日期时间。但是这两个看起来都很麻烦,我想我缺少一些简单的东西来完成这个。

提前致谢!

【问题讨论】:

    标签: sql sql-server datetime sql-server-2012 type-conversion


    【解决方案1】:

    由于您是 2012 年,我建议您使用 Try_Convert()。这将捕获任何转换错误。 (假设你的数据字符串是 m/d/y)

    要识别虚假记录,请尝试:

    Select * from YourTable where Try_Convert(datetime,AlarmTime) is null
    

    重新格式化数据的示例代码

    Declare @YourTable table (Alarm int,AlarmTime nvarchar(50))
    Insert Into @YourTable values
    (  1,'7/6/2016 10:10:42 AM'),
    (  2,'7/10/2016 6:41:23 PM'),
    (  3,'8/4/2016 4:35:53 PM')
    
    Select A.*
          ,ReFormated = format(try_convert(datetime,AlarmTime),'M/d/yyyy HH:mm:ss')
          ,AsDateTime = try_convert(datetime,AlarmTime)
     From  @YourTable A
    

    退货

    Alarm   AlarmTime               ReFormated          AsDateTime
    1       7/6/2016 10:10:42 AM    7/6/2016 10:10:42   2016-07-06 10:10:42.000
    2       7/10/2016 6:41:23 PM    7/10/2016 18:41:23  2016-07-10 18:41:23.000
    3       8/4/2016 4:35:53 PM     8/4/2016 16:35:53   2016-08-04 16:35:53.000
    

    【讨论】:

    • 我没听说过 try_convert。但是我运行并完成了没有错误,但是该列仍然为空。遵循并运行您的示例代码,一切运行正常。所以我认为我的问题可能在于我如何在列中读取和存储我的日期。我会尝试删除任何剩余的空间,看看是否有帮助。谢谢!
    • @Spex1848 很高兴它有帮助。我怀疑一些虚假数据。将日期时间存储为字符串总是有风险的......太多的事情可能会出错。
    • @Spex1848 只是好奇当您运行 Select * from YourTable where Try_Convert(datetime,AlarmTime) 为 null 时返回了多少条记录?全部还是少数?
    • 我刚刚再次尝试使用 LTRIM。当我运行上面描述的选择时,它会返回所有记录。所以这意味着我在任何时候都没有得到适当的转换。我现在很确定问题出在我传递的字符串上。现在试着看看我如何才能得到它,然后再次测试转换。再次感谢!
    • @Spex1848 在这里查看我的答案stackoverflow.com/questions/43148767/… 也许你的字符串中有控制字符
    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    相关资源
    最近更新 更多