【问题标题】:Convert date to number data type将日期转换为数字数据类型
【发布时间】:2020-12-16 21:06:45
【问题描述】:

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

使用的数据库是 SQL Server。

表格详情

create table test 
(
    id varchar(255),
    call_date varchar(255)
);

insert into test('26203', '14-Aug-2020');

我需要输出为 4405726203 -- 日期 (14-Aug-2014) + id (26203) 的串联

【问题讨论】:

  • 请向我们展示您的尝试...看起来您基本上已经完成了,那么您需要什么帮助?
  • 转到 SQL Server 文档并查看可用的功能。
  • 那么 44057 是从哪里来的?
  • 我尝试使用 CAST(CONVERT(datetime,call_date) as bigint) - 它返回 44055,当与 id 连接时,它会汇总这些值。
  • 在连接它们之前将它们转换为字符串。

标签: sql sql-server concat string-concatenation


【解决方案1】:

这行得通

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

结果

4405526203

【讨论】:

    【解决方案2】:

    在底层,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 亿左右,因此每个字段 9 位就足够了。

    【讨论】:

      【解决方案3】:

      我找到了解决办法:

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

      【讨论】:

      • 始终指定数据类型的长度。这可能会导致问题,难以解决。对于 VARCHAR,对于 CAST、CONVERT,它的默认长度为 30。但是,我们不应该依赖数据库来定义长度。 docs.microsoft.com/en-us/sql/t-sql/data-types/…
      【解决方案4】:

      评论太长了。

      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() 组合这些值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 2016-10-13
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多