SQL 服务器:如何将日期转换为以 36 为底的附加(3 位)?

Posted

技术标签:

【中文标题】SQL 服务器:如何将日期转换为以 36 为底的附加(3 位)?【英文标题】:SQL server: How can I convert dates to base 36 annexed (3-digit)? 【发布时间】:2020-06-30 09:45:16 【问题描述】:

enter image description here

2018 年 1 月 1 日默认设置为 000。提供的示例:2018 年 1 月 1 日转换为 00U。

转换必须与“00U”的转换方式相同。 下面是我如何从 my_packing 表中选择日期:

select convert(varchar(10), shipDTime, 103) 
from my_packing (nolock) where packNo='123';

输出:2018 年 1 月 31 日

所需输出:00U

【问题讨论】:

样本数据、所需结果和适当的数据库标签都会有所帮助。 您使用的是哪种 DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称,日期/时间函数是高度特定于供应商的。请为您正在使用的数据库产品添加tag。 Why should I tag my DBMS 编辑了问题。 @GordonLinoff 示例在问题中,我需要将 2018 年 1 月 1 日之后的任何日期更改为基数 36。2018 年 1 月 1 日设置为 000。然后使用 base36 将 31/1/2018 转换为 00U。 您能否展示一些您尝试转换的示例数据? @Harry 只是日期,2018 年 1 月 1 日之后的任何日期。例如:06/03/2020, 05/06/2019,04/08/2018... 但它必须使用与 31/1/2018 转换为 00U 相同的概念(这是由提供者)。 【参考方案1】:

enter image description here

Tq @Fandango 的回答,使用下面的代码设法在第 31 行获得 00U

WITH
  num AS (SELECT TOP 36 ROW_NUMBER() OVER(ORDER BY (SELECT 1)) i FROM rt_packing),
  chr AS (SELECT i,CASE WHEN i <= 10 THEN CHAR(i+47) ELSE CHAR (i+54) END c FROM num)
SELECT t2.c + t1.c + t0.c 
AS dateindex
FROM chr t2, chr t1, chr t0
ORDER BY  t2.i, t1.i, t0.i

目前,如果我在“rt_packing”表中的日期是 2018 年 1 月 31 日,如何选择第 31 行。 有人知道吗?

【讨论】:

抱歉再次纠缠,但你不应该用另一个问题来回答你自己的问题。请在发布前阅读 SO 指南。但你在正确的轨道上。 Tq 对于您的评论,我提出疑问,因为这是获得我的问题最终答案的步骤,因为我在顶部的问题是如何使用 sql server 将正常日期转换为 base 36,而不仅仅是如何base 36 转换工作。 @Fandango68【参考方案2】:

这是最终答案,我得到了同事的帮助来完成它。使用“查看”存储临时数据,使用“DATEDIFF”获取天数。 Tq *** 社区!

WITH num
AS (SELECT TOP 36 ROW_NUMBER() OVER(ORDER BY (SELECT 1)) i FROM my_packing),
  chr AS (SELECT i,CASE WHEN i <= 10 THEN CHAR(i+47) ELSE CHAR (i+54) END c FROM num)
SELECT ROW_NUMBER () OVER (ORDER BY t2.c + t1.c +t0.c) as gg, t2.c +t1.c +t0.c
AS dateindex
INTO #t
FROM chr t2, chr t1, chr t0
ORDER BY  t2.i, t1.i, t0.i

SELECT  dateindex from #t
where gg in (select DATEDIFF(DAY, '2016/12/31', printDTime) AS DateDiff from my_packing(nolock)
where prdNo = '1234') 

【讨论】:

干得好,感谢新人的理解。【参考方案3】:

首先,你需要了解如何在SQL(本例中为SQL Server)中生成Base36数字:

这里是一个例子,感谢之前的question。

WITH num
AS (SELECT TOP 36 ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS i
    FROM master.dbo.spt_values),
     chr
AS (SELECT i, CASE WHEN i <= 10 
                   THEN CHAR(i+47) 
                   ELSE CHAR(i+54) 
              END AS c
    FROM num)

SELECT t3.c + t2.c + t1.c + t0.c
FROM chr AS t3, chr AS t2, chr AS t1, chr AS t0
ORDER BY t3.i, t2.i, t1.i, t0.i

我不会解释代码,因为我也在思考它。但是,它使用主表来获取从“1”开始的数字序列。它也使用CTE。

现在您需要以某种方式使用此,将datetime 值转换为Base36。将您的datetime 视为一个,例如 4678.3783。 integer 部分是日期组件。 decimal 部分是时间组件。

【讨论】:

Tq 为您解答,当我删除“t3”时,它确实在 31 号处创建了 00U。我只需要将日期转换为基数 36,时间会被忽略。怎么样?

以上是关于SQL 服务器:如何将日期转换为以 36 为底的附加(3 位)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中将二进制字符串转换为以 10 为底的整数

将 UDF 从 MS SQL Server 移植到 MySQL 会引发异常不正确的双精度值

如何在 Ruby 中将十进制值数组转换为 MAC 地址?

将一个以 10 为底的数字转换为 N

如何在任意基数中创建数字的零填充字符串表示? [复制]

我应该在基数排序中使用哪个基数?以及如何在基数之间转换?