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

SQL server: How can I convert dates to base 36 annexed (3-digit)?

enter image description here

1/1/2018 默认设置为 000。提供示例:31/1/2018 转换为 00U。

转换必须与“00U”的转换方式相同。 下面是我如何 select 从 my_packing table:

开始的日期
select convert(varchar(10), shipDTime, 103) 
from my_packing (nolock) where packNo='123';

输出:31/01/2018

期望输出:00U

首先,您需要了解如何在 SQL 中生成 Base36 数字(在本例中为 SQL 服务器):

这里举个例子,感谢之前的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

我不会解释代码,因为我也在思考它。然而,它使用一个master table 来得到一个数字序列,从'1'开始。它还使用 CTE.

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

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”table 中的日期是 2018 年 1 月 1 日,如何 select 第 31 行,目前仍在研究中。 有人知道吗?

这里是最后的答案,是在同事的帮助下完成的。使用“View”存储临时数据,使用“DATEDIFF”获取天数。 Tq Whosebug 社区!

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')