【问题标题】:How to display a today date column, time column, previous date column, time column如何显示今天日期列、时间列、上一个日期列、时间列
【发布时间】:2010-11-04 21:19:00
【问题描述】:

使用 Access 数据库

表格

Cardno  name        cardeventdate Intime Outtime

0001    Michael     20080811      102746 185249
0001    Michael     20080812      080828 080828
0002    Michael     20080811      082615 082615
0002    Michael     20080812      073624 190605

从上表中我想显示另外两列

Cardno、姓名、cardeventdate、Intime、Outtime、Yesterday cardeventdate(上一列日期)、Yesterday Outtime(上一列Outtime)

对于 Cardno – 0001
姓名 – 迈克尔
日期 – 20080811
银泰 – 102746
超时 – 185249
昨天日期 – 102746
昨天的休息时间 - 185249

例如,今天 Intime 是 090000,Outtime 是 180000 我想显示今天日期、时间、超时、上一个日期列、上一个超时列属于 Cardno

我的日期不是连续的,在我的数据库中日期是 20090601、20090508。所以我们不能放 date-1

正在使用子查询

预期输出

Cardno name    cardeventdate Intime Outtime Yesterdaycardeventdate YesterdayOuttime

0001   Michael 20080811      102746 185249  20080810               175050
0001   Michael 20080812      080828 080828  20080811               185249
0002   Michael 20080811      082615 082615  20080810               192727
0002   Michael 20080812      073624 190605  20080811               082615

需要查询帮助?

【问题讨论】:

  • previous,你是指时间上的pervious,还是数据库中的前一行?当前的 CARDNO 或任何 CARDNO 是以前的吗?
  • 在预期的输出中,您似乎没有按 CARDNO 或 CARDEVENTDATE 进行排序,所以我真的不明白这个输出的重点。能否说明一下业务需求?
  • 是的,对于同一个 Cardno,它应该显示以前的记录。不要显示以前的记录,它应该显示该卡片的上一列日期和超时时间

标签: sql-server ms-access sql-server-2000


【解决方案1】:

“上一个”在 SQL Server 中并不是一个绝对的概念——它取决于您的数据是如何排序的。您如何对结果集进行排序?我看不到所有行都适用的任何内容。

SQL 2000 的解决方案很丑,但基本上看起来是这样的: **注意:根据上述附加信息编辑代码。

SELECT CARDNO, CARDEVENTDATE, INTIME, OUTTIME, 
       (SELECT TOP 1 CARDEVENTDATE 
        FROM MyTable b
        WHERE a.CARDNO = b.CARDNO
        AND   a.INTIME > b.INTIME
        ORDER BY INTIME DESC) AS PREVCARDEVENTDATE,
       (SELECT TOP 1 OUTTIME
        FROM MyTable b
        WHERE a.CARDNO = b.CARDNO
        AND   a.INTIME > b.INTIME
        ORDER BY INTIME DESC) AS PREVOUTTIME
FROM   MyTable AS a

使用 SQL 2005 或 2008 和排名函数可以获得更灵活的解决方案 - 如果您有兴趣,请查看我的博客文章:

http://thehobt.blogspot.com/2009/02/rownumber-rank-and-denserank.html

【讨论】:

  • am 使用子查询,intime 和 outtime 从时间获取,所以我必须如何使用您的查询。什么是 mysortfield?
  • 根据您对原始问题留下的 cmets 的反馈,您需要按 INTIME 或 OUTTIME 排序(我想它们会产生相同的结果)并使用外部的 CARDNO 过滤子查询询问。我已经调整了我的帖子以反映这一点 - 看看。
  • 我尝试了您的查询,但它显示错误,下面我发布了我的查询 我必须如何使用您的查询?请。
  • SELECT CARDNO, NAME, TITLENAME, CARDEVENTDATE, INTIME, OUTTIME FROM (SELECT CARDNO, NAME, TITLENAME, CARDEVENTDATE, MIN(CARDEVENTTIME) AS INTIME, MAX(CARDEVENTTIME) AS OUTTIME FROM (SELECT T_PERSON.CARDNO) , T_PERSON.NAME, T_TITLE.TITLENAME, T_CARDEVENT.CARDEVENTDATE, T_CARDEVENT.CARDEVENTTIME FROM (T_TITLE INNER JOIN T_PERSON ON T_TITLE.TITLECODE = T_PERSON.TITLECODE) INNER JOIN T_CARDEVENT ON T_PERSON.PERSONID = T_CARDEVENT.PERSONID WHERE T_CARDEVENT'B。 sdate & "' AND '" & edate & "' ORDER BY T_PERSON.TITLECODE) GROUP BY CARDNO, NAME, TITLENAME, CARDEVENTDATE
  • 你从哪里得到的代码?这不是我发布的 - 我没有使用任何聚合函数或派生表。
【解决方案2】:

你能不能将字符串转换为 smalldatetime,然后从日期中删除一个 - 例如 cast('20080102' as smalldatetime) -1

【讨论】:

    【解决方案3】:

    你能不能将字符串转换为 smalldatetime,然后从日期中删除一个 - 例如 cast('20080102' as smalldatetime) -1

    cast('20080101' as smalldatetime) -1 将返回 20080100

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多