【问题标题】:Conversion of SQL Server datetime column to 24h format failingSQL Server 日期时间列转换为 24 小时格式失败
【发布时间】:2012-01-24 20:31:06
【问题描述】:

我有一个带有 DateTime 列的 SQL Server 2008 表,我想将其转换为 24 小时格式。

规范的指导是使用以下内容:

select CONVERT(datetime, GetDate(), 121)

产生:

2012-01-24 15:22:27.340

完美。好的,应用这些知识,让我们将GetDate() 替换为CONVERT 表达式的列:

select top(5) CONVERT(datetime, LogTable.Timestamp, 121) from LogTable
order by LogTable.Id DESC

我们得到:

2012-01-24 03:25:47.933
2012-01-24 03:25:46.917
2012-01-24 03:25:46.547
2012-01-24 03:25:46.543
2012-01-24 03:25:46.543

我做错了什么?与GetDate() 函数的输出相反,应如何设计表达式以使CONVERT 在列上工作?

【问题讨论】:

  • 到底出了什么问题?为什么你的输出出乎意料?
  • LogTable.Timestamp 中的实际数据是什么?这是 VarChar(或 nvarchar)列,还是已经是 DateTime?
  • 您确定 LogTable.Timestamp 数据实际上不是凌晨 3 点吗?
  • 您的示例甚至不应该编译,您没有从任何表中进行选择。我很惊讶你实际上得到了一些数据。 \
  • 我期待的输出是 24 小时格式 - 例如。下午 3:25 = 15:25。该字段的类型为日期时间。是的,时间戳实际上来自最近的一次捕获,所以是美国东部标准时间下午 3 点。

标签: sql tsql datetime time


【解决方案1】:

24h 格式只对字符串很重要。使用时:

convert(datetime, ...

您正在转换为日期时间。要显示 24 小时,您必须转换为字符串,例如:

convert(varchar(24), ...

如果您从 varchar 列开始,您可以将其convert 转换为 datetime 并返回到 varchar 以 24 小时格式显示。例如,要转换 AM/PM varchar 并以 24 小时显示:

select convert(varchar(16), convert(datetime, 'sep 01 2011 01:23PM', 100), 120)

这里,样式 100 用于解析。样式 120 用于格式化。

【讨论】:

  • 我明白了;但是,如果 24h 格式仅适用于字符串,为什么 CONVERT(datetime, GetDate(), 121) 会生成 24h 格式的日期?
  • 您的客户端可能配置为显示 24 小时日期。 select getdate() 是否也显示 24 小时日期?
【解决方案2】:

我已设法找到解决此问题的方法:将时间戳写入 SQL 表的服务是通过错误的格式将“裸”日期时间写入字段,从而有效地使它们显示为“AM”,而不管它们何时到了。

我设法重新编写了源代码以将 24 小时日期时间写入该字段,并且它现在按预期执行。得知我的直觉是正确的,而且源头是错误的服务,我松了一口气。

感谢大家的建议和指导——非常非常感谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多