Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL server:如何将日期转换为基数36(3位)?_Sql_Sql Server_Date_Base N - Fatal编程技术网

SQL server:如何将日期转换为基数36(3位)?

SQL server:如何将日期转换为基数36(3位)?,sql,sql-server,date,base-n,Sql,Sql Server,Date,Base N,2018年1月1日默认设置为000。提供的示例:2018年1月31日转换为00U 转换方式必须与00U的转换方式相同。 以下是我如何从我的包装表中选择日期: select convert(varchar(10), shipDTime, 103) from my_packing (nolock) where packNo='123'; 产出:2018年1月31日 所需输出:00U首先,您需要了解如何在SQL Server中生成Base36数字,在这种情况下: 这是一个例子,多亏了前面的一个例子

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

转换方式必须与00U的转换方式相同。 以下是我如何从我的包装表中选择日期:

select convert(varchar(10), shipDTime, 103) 
from my_packing (nolock) where packNo='123';
产出:2018年1月31日


所需输出:00U

首先,您需要了解如何在SQL Server中生成Base36数字,在这种情况下:

这是一个例子,多亏了前面的一个例子

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

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

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
目前,仍在考虑如何选择第31行,如果我在rt_包装表中的日期是2018年1月31日。
有人知道吗?

这是最后的答案,我得到了同事的帮助来完成它。使用View存储临时数据,使用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') 

示例数据、期望的结果和适当的数据库标记都会有所帮助。您使用的是哪种DBMS产品?SQL只是一种查询语言,而不是特定数据库产品的名称,并且日期/时间函数非常特定于供应商。请为您正在使用的数据库产品添加。编辑了这个问题@GordonLinoff样本存在问题,我需要将2018年1月1日之后的任何日期更改为基数36。2018年1月1日设定为000。然后,使用base36将2018年1月31日转换为00U。能否显示一些您试图转换的样本数据?@Harry just dates,2018年1月1日之后的任何日期。Ex:2020年3月6日、2019年6月5日、2018年8月4日。。。但它必须使用与2018年1月31日转换为00U相同的概念。这是提供商提供的转换示例。Tq对于您的答案,当我删除t3时,它确实会在31号处创建00U。我只需要将日期转换为基数36,时间被忽略。怎么做?很抱歉再次纠缠,但你不应该用另一个问题回答你自己的问题。请在发布前阅读SO指南。Tq为了您的评论,我提出这个问题是因为这是获得我问题最终答案的步骤,因为我在顶部的问题是如何使用sql server将正常日期转换为基数36,而不仅仅是基数36转换如何工作@Fandango68干得好,感谢您对这里的了解。
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')