【问题标题】:How to remove trailing zeros from milliseconds value(datetime 2)in string format by one query如何通过一个查询从字符串格式的毫秒值(日期时间 2)中删除尾随零
【发布时间】:2020-11-30 08:33:52
【问题描述】:

我使用了 SQL Server。我将具有不同比例的 datetime2 列中的值转换为字符串,并将它们与处理空值(如果存在)进行比较。因此,我需要通过一个查询来转换这些数据而不拖尾空值,而无需任何程序 例如,

'2018-06-23 07:30:20.100' should be '2018-06-23 07:30:20.1'
'2018-06-23 07:30:20.000' should be '2018-06-23 07:30:20.'
'2018-06-23 07:30:20.101' should be '2018-06-23 07:30:20.101'

我使用了以下内容:

select CONVERT(VARCHAR, col1, 126)  from  [DBO].[DATE_TABLE1]

但它显示了意想不到的结果:

'2018-06-23 07:30:20.100' defined as '2018-06-23 07:30:20.100' - **unexpected(trailing zeros weren't removed)**
'2018-06-23 07:30:20.000' defined as '2018-06-23 07:30:20' - expected    
'2018-06-23 07:30:20.101' defined as '2018-06-23 07:30:20.101' - expected

如何在没有尾随零的情况下转换 datatime2 值? 谢谢

【问题讨论】:

  • 在 SQL 中,你不需要。这是您的表示层的任务。
  • I converted value from datetime2 column with different scales to string and compare them to process null values if they are exist 为什么??? datetime2 没有尾随零,它是一个二进制值,就像 decimal。您不需要将其转换为字符串来检查 null,事实上这是没有意义的 - null 仍然是 null。 real 问题是如何检查相等性的吗?您不会将 decimal 转换为字符串来检查是否相等。您要么将两个值转换为相同的精度,要么检查绝对差是否小于限制
  • 那么你到底想做什么?不管是什么,都不涉及字符串
  • should be '2018-06-23 07:30:20.1' 不,不应该。除了旧的数字手表,人类不会像这样写毫秒。 .1 是 100 毫秒,没有人希望将其视为 .1,除非没有空间显示更多数字。即使那样,位数也是固定的 - 在秒表中,您总是只能看到一个小数位
  • 非常重要,因为这个问题没有意义。没有尾随零 - 这两个值相同。如果你写了where t1=t2,你就会得到匹配。正是因为没有格式。您是否尝试过将它们按原样进行比较?如果需要截断毫秒,使用cast(colN as datetime2(1))转换成同样的精度

标签: sql-server datetime2


【解决方案1】:

试试这个:

DECLARE @DataSource TABLE
(
    [value] DATETIME2(3)
);

INSERT INTO @DataSource ([value])
VALUES ('2018-06-23 07:30:20.100')
      ,('2018-06-23 07:30:20.000')
      ,('2018-06-23 07:30:20.101');

SELECT [value]
      ,CONVERT(VARCHAR(20), [value], 121) + REPLACE(FORMAT(DATEPART(MILLISECOND, [value]) / 1000.0, 'g3'), '0.', '') AS [new_value]
FROM @DataSource;

【讨论】:

  • 这不是必需的。这两列可以直接比较,因为.1.100是同一个值。如果其中一个字段有额外的有效位必须被截断,cast( ... as datetime2(1)) 会将它们转换为相同的精度
  • @PanagiotisKanavos 但如果您转换为 datetime2(1) 或我错过了什么,您将失去 101
  • @gotqn OP 正在尝试比较 datetime2 不同精度的值。这与格式无关。至少这是一个XY问题。但是 OP 从问题中删除了这部分,以避免解释为什么不直接比较这些值
【解决方案2】:

谢谢大家。相反,我决定在最大分数秒值 7 之前添加零。而且我知道这个解决方案与我的问题相冲突,但它有助于比较字符串格式的 datetime2 值。我决定使用以下语句:

 CONVERT(VARCHAR, CAST({{ columnName }}  AS DATETIME2), 121)

我用过 该值将获取所有小数秒值的信息,因此我可以比较具有不同比例(小数秒)值的列中的值。 如果是雪花,我会'YYYY-MM-DD HH:MI:SS.FF9'...... 例如,在 sql server 中,我们有 2 个表,其中包含具有不同值的 datetime2 列。

create table [DBO].[DATE_TABLE1] (col1 datetime2(1))
create table [DBO].[DATE_TABLE2] (col1 datetime2(7))

我在 '2018-06-23 07:30:20.1' 中插入了相同的值 为 2 个表执行 'CONVERT(VARCHAR, CAST({{ columnName }} AS DATETIME2), 121)' 后,我将得到相同的字符串值:

'2018-06-23 07:30:20.10000000' from [DBO].[DATE_TABLE1]
'2018-06-23 07:30:20.10000000' from [DBO].[DATE_TABLE2]

并且这些值将相等。 如果我使用 'CONVERT(VARCHAR, {{ columnName }} , 121)',我会得到不同的值:

'2018-06-23 07:30:20.1' from [DBO].[DATE_TABLE1]
'2018-06-23 07:30:20.10000000' from [DBO].[DATE_TABLE2]

【讨论】:

    猜你喜欢
    • 2013-03-03
    • 1970-01-01
    • 2013-06-25
    • 2022-11-23
    • 2020-08-08
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多