TSQL:如何格式化时间:'0.729166667' 像 Excel 一样:'5:30:00 pm'

Posted

技术标签:

【中文标题】TSQL:如何格式化时间:\'0.729166667\' 像 Excel 一样:\'5:30:00 pm\'【英文标题】:TSQL: How to format time: '0.729166667' like Excel does: '5:30:00 pm'TSQL:如何格式化时间:'0.729166667' 像 Excel 一样:'5:30:00 pm' 【发布时间】:2021-11-17 19:10:27 【问题描述】:

我在 T-SQL 中有一个表,它有 2 列,格式如下:

Column_name Type    Computed    Length  Prec    Scale   Nullable    TrimTrailingBlanks  FixedLenNullInSource    Collation
LocCd       varchar no              -1                  yes         no                  yes                     SQL_Latin1_General_CP1_CI_AS
TimeField   float   no               8    53    NULL    yes         (n/a)               (n/a)                   NULL

两列的值为:

LocCd  Timefield
A      0.729166666666667
B      0.791666666666667
C      0.770833333333333
D      0.791666666666667

timefield 是一个有效的时间字段,当使用“时间”格式化时,excel 可以很好地读取它。但是,我无法让 SQL 识别它。这是我复制列并将其格式化为“时间”时 Excel 的样子:

loc_cd  Raw time: SQL   Formatted time: Excel
A       0.729166667     5:30:00 PM
B       0.791666667     7:00:00 PM
C       0.770833333     6:30:00 PM
D       0.791666667     7:00:00 PM

如何在 T-SQL 中执行此操作?我一直在搞乱的代码如下:

select loccd,
       timefield
--  Ive been messing with every format I can find, below.  
--     DATEADD(S, CONVERT(int,LEFT(scheduled, 10)), '1970-01-01')
from tablename;

【问题讨论】:

cast(0.729166666666667 as datetime) 谁决定将时间存储为浮点数?您可能需要重新考虑这一点,因为有一个更合适的 time 数据类型。 这能回答你的问题吗? How does CONVERT (DATETIME, FLOAT) work? timefield 是一个有效的时间字段” 事实上,它是 float,而不是 time,这意味着它根据定义 不是有效时间 另外,我刚刚注意到NocID 被定义为varchar(MAX)。如果它是一个 ID,为什么它需要 2GB 的大小 per 值? 【参考方案1】:

您存储的“时间”似乎是一天中已完成的百分比。

至少有两种方法可以做到这一点:

DECLARE @t TABLE(LocCd char(1), Timefield float);

INSERT @t(LocCd, Timefield) VALUES
('A', 0.729166666666667),
('B', 0.791666666666667),
('C', 0.770833333333333),
('D', 0.791666666666667);

SELECT *, CONVERT(time, CONVERT(datetime, Timefield)) 
  FROM @t;

SELECT *, CONVERT(time, DATEADD(MILLISECOND, Timefield * 86400000, 0))
  FROM @t;

两个结果:

LocCd Timefield (No column name)
A 0.729166666666667 17:30:00
B 0.791666666666667 19:00:00
C 0.770833333333333 18:30:00
D 0.791666666666667 19:00:00
示例db<>fiddle

但是,我强烈建议重新考虑将“时间”存储为代表一天中部分时间的浮点数的决定。当您使用错误的数据类型时,您会丢失任何类型的验证,例如是什么阻止用户输入-542.92434324?并且您强制执行繁琐的逆向工程以正确呈现数据,就像这样,如果您从一开始就使用正确的数据类型,则不需要这样做。我没有特别提到将time 存储为float,但更多信息请参见Bad Habits to Kick : Choosing the wrong data type。

【讨论】:

以上是关于TSQL:如何格式化时间:'0.729166667' 像 Excel 一样:'5:30:00 pm'的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ISO8601 TSQL DATETIME 参数与 PDO 绑定?

TSQL:如何将本地时间转换为 UTC? (SQL Server 2008)

TSQL 日期时间问题

简单的TSQL基础编程格式

TSQL 日期时间 ISO 8601

Tsql -> 从今天开始过滤 6 个月的数据,表中的日期字段为 YYYYMM