【问题标题】: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 值?

标签: sql sql-server datetime


【解决方案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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2019-11-08
    相关资源
    最近更新 更多