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 为底的整数