Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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 我想知道我们为什么要拿那256块的具体原因,。。以下转换中的数字_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 我想知道我们为什么要拿那256块的具体原因,。。以下转换中的数字

Sql 我想知道我们为什么要拿那256块的具体原因,。。以下转换中的数字,sql,sql-server,tsql,Sql,Sql Server,Tsql,投影代码用于将日期转换为整数,反之亦然。我想知道为什么我们在这里使用这个特定的十六进制代码和数字序列从int返回日期。如果有关于这个代码示例的文章,它也会帮助我实际理解这个代码 我已经尝试了在线十六进制到十进制的转换代码,发现它是一个256^1256^2。。。即使试图找不到确切的原因 declare @dDate date = '2017-10-12' declare @iDate int = 0 select @iDate = ( (datepart(year,@dDate)*65536 |

投影代码用于将日期转换为整数,反之亦然。我想知道为什么我们在这里使用这个特定的十六进制代码和数字序列从int返回日期。如果有关于这个代码示例的文章,它也会帮助我实际理解这个代码

我已经尝试了在线十六进制到十进制的转换代码,发现它是一个256^1256^2。。。即使试图找不到确切的原因

declare @dDate date = '2017-10-12'
declare @iDate int = 0

select @iDate = ( (datepart(year,@dDate)*65536 | datepart(month,@dDate)*256 | datepart(dd,@dDate)))

select (@iDate&0xfff0000)/65536  --year
select (@iDate&0xff00)/256   --Month
select (@iDate&0xff)         --Date

&是一个运算符,它执行按位AND运算。“|”是按位或。见和。有关使用按位和/或在单个数字列中存储多个数字值的说明,请参见。 本部分:

@iDate&0xfff0000
将“屏蔽”或用零消除/替换iDate中不在256^2范围内的部分。然后你除以65536,这是简单地颠倒了原来的计算方法,将年份乘以65536

如果按位AND的概念是外来的,我将给出一个不适用于十进制的示例。按位并将整个内容转换为二进制,然后屏蔽内容(如IP子网,如果您熟悉的话)

无论如何,考虑一个十进制数20171012。如果像十进制这样的东西存在,它可能看起来像
20171012&11110000
。“1”位是“保管员”,而“0”位是“丢弃者”。如果垂直堆叠这些值,其结果是将值保留在其下方的“1”中,并将值替换为其下方的“0”中的“0”

现在结果不是2017年,所以你必须除以10000才能得到2017年。 对于
20171012和1100
您必须使用隐含的前导零:

number       20171012
dec-wise AND 00001100
result           1000
我可能会通过加上年*10000和月*100和日来转换为int。回过头来看,我将使用整数除法和MOD的组合。但我认为按位排列可能更优雅一点(特别是对于获得月份)

根据您的评论,我将介绍如何将日期转换为int并还原回:

declare @dDate date = '2017-10-12'
declare @iDate int

set @iDate = year(@dDate) * 10000 + month(@dDate) * 100 + day(@dDate)

select @iDate

select 'year', @iDate/10000 -- basic integer division provides the year
select 'month', (@iDate % 10000)/100 -- combine modulo and integer division to get the month
select 'day', @iDate % 100  -- basic modulo arithmetic provides the day
返回:

20171012
year    2017
month     10
day       12

这是位操纵

位移位

十进制3=二进制11


如果我们左移(
number 20171012 dec-wise和11110000 result 20170000Wat如果转换像2017 | 10 | 12除法,则执行模数的效率不如执行位
性能将是一件有趣的事情。这两种方法都包括年和月的整数除法。2模运算与3按位and运算。我只是想知道它有多重要。我很感兴趣的是,原始代码选择了65536和256。我认为64和1024就足够了。不过,我想掩码更难理解。这些是一些重要的日期,无法显示,所以需要加密。这是加密格式.如果你没有答案,没关系,我理解。
20171012
year    2017
month     10
day       12
    12 = 1100
     2 = 0010
OR 
---------------
    14 = 1110