将日期转换为数字数据类型

问题描述

我正在尝试将日期转换为数字,如下所示,不确定哪个函数效果更好。

使用的数据库sql Server。

表格详细信息

boolean

我需要输出为4405726203-它的日期(create table test ( id varchar(255),call_date varchar(255) ); insert into test('26203','14-Aug-2020'); )+ id(14-Aug-2014)的串联

解决方法

这个评论太长了。

SQL Server允许您将datetime转换为浮点数。那应该是:

select cast(dte as float)
from (values (convert(datetime,'14-Aug-2020'))) v(dte)

但是,相应的浮点值为44055(https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=d142a64db0872e7572eb4fbd6d5d5fe7)。您的意图有点神秘。

您可以减去2,但这似乎是任意的。您可以计算自1899-12-30以来的天数。但这似乎也很武断。

无论如何,一旦您知道如何将日期转换为所需的数字,只需使用concat()来组合值。

,

我找到了解决方法:

convert(varchar,CAST(CONVERT(datetime,call_date) as bigint)) + id
,

在后台,SQL Server DateTime是2个32位整数的元组:

  • 第一个整数是自该时期以来的天数,对于SQL Server,该整数为1 January 1900
  • 第二个整数是自一天开始(00:00:00.000)以来的毫秒数。除了计数以3或4毫米的增量递增。微软只知道为什么做出这个决定。

您可以使用

获取自纪元以来的天数
convert( int,convert( date,t.call_date ) )

[在convert(varchar,... )中将其包装成字符串]

看起来您的id已经是varchar,所以您可以说:

select compound_key = convert(varchar,convert(int,convert(date,call_date
                          )
                        )
                      )
                    + t.id
from test t

我建议您将两个字段都以前导零填充到固定长度,以免发生可能的冲突(假设您尝试在此处生成密钥)。带符号的32位整数溢出了21亿ish,因此每个字段9位就足够了。

,

这有效

select concat(datediff(d,cast(call_date as date)),id)
from 
  (values ('26203','14-Aug-2020')) v(id,call_date);

结果

4405526203