Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何通过一次查询从字符串格式的毫秒值(datetime 2)中删除尾随零_Sql Server_Datetime2 - Fatal编程技术网

Sql server 如何通过一次查询从字符串格式的毫秒值(datetime 2)中删除尾随零

Sql server 如何通过一次查询从字符串格式的毫秒值(datetime 2)中删除尾随零,sql-server,datetime2,Sql Server,Datetime2,我用的是SQL Server。我将具有不同比例的datetime2列中的值转换为字符串,并将它们与process null值(如果存在)进行比较。因此,我需要在不使用任何过程的情况下,通过一个查询来转换这些数据,而不会跟踪null 比如说, '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-2

我用的是SQL Server。我将具有不同比例的datetime2列中的值转换为字符串,并将它们与process null值(如果存在)进行比较。因此,我需要在不使用任何过程的情况下,通过一个查询来转换这些数据,而不会跟踪null 比如说,

'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值? 谢谢

试试这个:

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;

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

 CONVERT(VARCHAR, CAST({{ columnName }}  AS DATETIME2), 121)
我曾经 该值将获得所有分数秒值的信息,因此我可以比较具有不同刻度(分数秒)值的列中的值。 如果是雪花,我会“YYYY-MM-DD HH:MI:SS.FF9”。。。 例如,在sql server中,我们有两个表,其列的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]

在SQL中,您不需要。这是表示层的任务。
我将datetime2列中具有不同比例的值转换为字符串,并将它们与存在的处理空值进行比较
为什么
datetime2
没有尾随的零,它是一个二进制值,就像
decimal
一样。您不需要将其转换为字符串来检查null,事实上这是毫无意义的-null仍然是null。真正的问题是如何检查平等性?您不会将
十进制
转换为字符串来检查是否相等。您可以将这两个值转换为相同的精度,或者检查绝对差值是否小于极限值。那么,您实际想做什么?不管是什么,都不涉及字符串
应该是'2018-06-23 07:30:20.1'
不应该。除了旧的数字手表,人类不会这样写毫秒。
.1
是100毫秒,除非没有空间显示更多的数字,否则没有人会认为这是
.1
。即使这样,数字的数量也是固定的——在秒表中,你总是只能看到一个分数数字。这是非常重要的,因为这个问题没有意义。没有尾随零-这两个值相同。如果你写了
其中t1=t2
,你会得到一个匹配。正是因为没有格式。你有没有试着比较一下他们的现状?如果需要截断毫秒,请使用
cast(colN as datetime2(1))
转换为相同的精度,这是不必要的。可以直接比较这两列,因为
.1
.100
是相同的值。如果其中一个字段具有必须截断的额外有效数字,
cast(…as datetime2(1))
会将它们转换为相同的值precision@PanagiotisKanavos但是如果您选择日期时间2(1),您将丢失
101
或者我遗漏了什么?@gotqn OP正在尝试比较不同精度的
datetime2
值。这与格式无关。这至少是一个XY问题。但是OP从问题中删除了这一部分,以避免解释为什么不直接比较这些值