首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按日显示从-到

按日显示从-到
EN

Stack Overflow用户
提问于 2012-10-19 09:13:04
回答 5查看 277关注 0票数 3

我的数据如下所示

代码语言:javascript
运行
复制
SERVICE_ID  DATE_SEQ    DAY_SEQ
101004           2012-10-18       1
101004           2012-10-19       2
101001           2012-10-20       3
101004           2012-10-21       4

我希望查询生成日期显示为date {From-to}的范围,它将按服务id分组,日期为序列,如果为final,则显示为

输出:

代码语言:javascript
运行
复制
**Service_id**      **From-To**                **Date**
101004      2012-10-18 - 2012-10-19         1-2
101001      2012-10-20 - 2012-10-20         3-3
101004      2012-10-21 - 2012-10-21         4-4
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-22 08:02:41

尝尝这个

代码语言:javascript
运行
复制
DECLARE @TB AS TABLE(
  SERVICE_ID INTEGER,
  DATE_SEQ SMALLDATETIME,
  DAY_SEQ NVARCHAR(10),
  FARE_SUP_ID INT
)

INSERT INTO @TB VALUES
  (101004,'2012-10-18 00:00:00',1,267),
  (101001,'2012-10-19 00:00:00',2,171),
  (101004,'2012-10-20 00:00:00',3,267),
  (101004,'2012-10-21 00:00:00',4,171),
  (101001,'2012-10-22 00:00:00',5,171),
  (101001,'2012-10-23 00:00:00',6,171),
  (101004,'2012-10-24 00:00:00',7,267)

SELECT * fROM @TB

;WITH TB1 AS (


SELECT 
  T1.SERVICE_ID,
  MIN(T1.DATE_SEQ) AS CHECK_IN, 
  MAX(T2.DATE_SEQ) AS CHECK_OUT,
  MIN (T1.DAY_SEQ) + ' - ' + MAX(T2.DAY_SEQ) AS DAY_SEQ,
  MAX(T1.FARE_SUP_ID) AS FARE_SUP_ID,
  1 AS DIFF
  FROM @TB T1 INNER JOIN @TB T2
    ON T1.SERVICE_ID = T2.SERVICE_ID
  WHERE DATEDIFF(DY, T1.DATE_SEQ ,T2.DATE_SEQ) = 1
  GROUP BY 
    T1.SERVICE_ID

UNION ALL

SELECT  T3.SERVICE_ID,T3.DATE_SEQ AS CHECK_IN ,T4.DATE_SEQ AS CHECK_OUT 
  ,T3.DAY_SEQ,T3.FARE_SUP_ID,DATEDIFF(DY, T3.DATE_SEQ ,T4.DATE_SEQ)  AS DIFF
  FROM @TB T3 INNER JOIN @TB T4
    ON T3.SERVICE_ID = T4.SERVICE_ID
  WHERE DATEDIFF(DY, T3.DATE_SEQ ,T4.DATE_SEQ) = 0
    AND 
    T3.DATE_SEQ NOT IN (
      SELECT T1.DATE_SEQ
        FROM @TB T1 INNER JOIN @TB T2
          ON T1.SERVICE_ID = T2.SERVICE_ID
        WHERE DATEDIFF(DY, T1.DATE_SEQ ,T2.DATE_SEQ) = 1
    )
    AND 
      T4.DATE_SEQ NOT IN (
        SELECT T2.DATE_SEQ
          FROM @TB T1 INNER JOIN @TB T2
            ON T1.SERVICE_ID = T2.SERVICE_ID
          WHERE DATEDIFF(DY, T1.DATE_SEQ ,T2.DATE_SEQ) = 1
      )
  )
SELECT 
  *
  FROM TB1
  ORDER BY DAY_SEQ
票数 2
EN

Stack Overflow用户

发布于 2012-10-19 09:36:23

尝试这样做,其思想是根据主查询的ID在主查询上运行内部查询:

代码语言:javascript
运行
复制
select 
SERVICE_ID, 
(select cast(min(DATE_SEQ) AS VARCHAR(20)) from my_table where SERVICE_ID = mt.SERVICE_ID) + ' - ' +(select cast(min(DATE_SEQ) AS VARCHAR(20)) from my_table where SERVICE_ID = mt.SERVICE_ID) as FROM_TO,
(select cast(min(DAY_SEQ) AS VARCHAR(20)) from my_table where SERVICE_ID = mt.SERVICE_ID) + ' - ' +(select cast(min(DAY_SEQ) AS VARCHAR(20)) from my_table where SERVICE_ID = mt.SERVICE_ID) as DATE
from my_table mt
票数 0
EN

Stack Overflow用户

发布于 2012-10-19 09:58:09

我可能不明白这个问题。

( CONCAT()函数依赖于DBMS,您可能需要将日期转换为文本)

这似乎是一个直截了当的“按”查询组:

代码语言:javascript
运行
复制
SELECT Service_id, 
CONCAT(MIN_DATE," - ", MAX_DATE) AS FromTo,
CONCAT(MIN_SEQ," - ", MAX_SEQ) AS Date
FROM
(
  SELECT Service_id, 
  MIN(DATE_SEQ) AS MIN_DATE, 
  MAX(DATE_SEQ) AS MAX_DATE, 
  MIN(DAY_SEQ) AS MIN_SEQ, 
  MAX(DAY_SEQ) AS MAX_SEQ
  FORM YOUR_TABLE
  GROUP BY Service_id ) AS A

希望这能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12971001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档