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