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;
两个结果:
示例db<>fiddle
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
但是,我强烈建议重新考虑将“时间”存储为代表一天中部分时间的浮点数的决定。当您使用错误的数据类型时,您会丢失任何类型的验证,例如是什么阻止用户输入-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 绑定?