首页 > 解决方案 > 如何从 SQL Server 数据库转换此时间格式

问题描述

因此,我们有一个软件供应商将时间存储在 CHAR(216) 字段中的数据库中。在 GUI 中,您可以以 15 分钟为增量选择门的开放时间。因此,在下面的示例中,营业时间为周一至周五上午 8 点至下午 5 点。所以有趣的部分。以下是我在下面的示例中时间位在 SQL 中的存储方式。据我所知,数据是按周日至周六的顺序存储的。有人对我如何将其转换为实际的日期和时间有任何想法吗?

Mon-Fri 8AM-5PM: 00000000000000000000000000000000FFFFFFFF0F00000000000000FFFFFFFF0F00000000000000FFFFFFFF0F00000000000000FFFFFFFF0F00000000000000FFFFFFFF0F000000000000000000000000000000000000000000000000000000000000000000000000000000

All Closed: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

全部打开:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

营业时间

标签: sqlsql-server

解决方案


计算流i中每1一位的索引。i*15是自一周开始以来的分钟数(周日,00:00?),因此您将该分钟数添加到一周的开始,并获得该开放间隔开始的时间点。

显然,数据是按字节表示的,首先是 LSB。请注意,每个十六进制字符代表 4 位,即正好是一小时。

您可以遍历字符串,一次提取两个十六进制字符,转换为整数,然后找到设置的位,同时i为每个处理的位增加索引。

伪代码:

byte currentByte;
for ( int bitIndex = 0; bitIndex < (216*4); bitIndex++ ) {
  if ( bitIndex % 8 == 0 ) {
    /* Need to fetch next byte from the bit-map */
    int stringIndex = bitIndex / 4; /* 4 bits make up one character */
    String hexByte = substring( input, stringIndex, stringIndex + 2); /* get next two hex characters */
    currentByte = parse_hex( hexByte );
  }
  if ( (currentByte & 1) != 0 ) {
    /* Lowest bit is set -> open! */
    output( "Open starting at " + (bitIndex * 15) + " minutes from the start of the week.");
  } else {
    /* Lowest bit not set -> closed! */
  }
  currentByte = currentByte / 2; /* logical shift right by 1 bit */
}

推荐阅读