Как отобразить столбец сегодняшней даты, столбец времени, предыдущий столбец даты, столбец времени - PullRequest
2 голосов
/ 22 июня 2009

Использование базы данных 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, name, cardeventdate, Intime, Outtime, вчерашний cardeventdate (дата предыдущего столбца), вчерашний Outtime (предыдущий столбец Outtime)

Для Кардно - 0001
Имя - Михаил
Дата - 20080811
Интайм - 102746
Outtime - 185249
Дата вчерашнего дня - 102746
Вчерашнее время - 185249

Например, сегодня Intime составляет 090000, а Outtime - 180000 Я хочу, чтобы столбцы «Дата сегодня», «Время», «Время выхода», «Предыдущая дата», «Столбец предыдущего времени» принадлежат Cardno

Моя дата не постоянно, в моей базе данных дата такая же, как 20090601, 20090508. Поэтому мы не можем поставить дату-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

Нужна помощь по запросу?

Ответы [ 3 ]

1 голос
/ 22 июня 2009

«Предыдущий» не является абсолютным понятием в 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

0 голосов
/ 01 июля 2009

Не можете ли вы привести строку к маленькому времени, а затем удалить ее из даты - например, приведение ('20080102' как маленькое время) -1

cast ('20080101' как smalldatetime) -1 вернет 20080100

0 голосов
/ 24 июня 2009

Не можете ли вы привести строку к smalldatetime, а затем удалить ее из даты - например, cast ('20080102' как smalldatetime) -1

...