2009-11-03 3 views
0

Использование VB.NET и SQL Server 2005Как создать дату для данного времени?

Я хочу, чтобы создать дату в соответствии с данным Outtime,

Am ввода значения, как

ID Date  Intime Outtime Holiday 

001 23-02-2009 08:00:00 17:00:00 no 
001 24-02-2009 17:00:00 08:00:00 no 
001 25-02-2009 10:00:00 16:00:00 no 
001 26-02-2009 18:00:00 20:00:00 no 
001 27-02-2009     yes 

Ожидаемый выход

Table1

ID Date  Intime Outtime DateIn  Dateout 

001 23-02-2009 08:00:00 17:00:00 23-02-2009 23-02-2009 
001 24-02-2009 17:00:00 08:00:00 24-02-2009 25-02-2009 
001 25-02-2009 10:00:00 16:00:00 25-02-2009 25-02-2009 
001 26-02-2009 18:00:00 20:00:00 26-02-2009 27-02-2009 
001 27-02-2009  -  -  -   - 

…, 

От над таблицей, значение столбца DateIn должно отображать значение столбца той же даты, но столбец Dateout должен отображаться в соответствии с Outtime.

In a first row – Intime is 08:00:00 and Outtime is 17:00:00, So Dateout should display the same date 
In a second row – Intime is 17:00:00 and Outtime is 08:00:00, So DateOut should display the next day date. 
In a third row – Intime is 10:00:00 and Outtime is 16:00:00, so Dateout should display the same date 
In a fourth row – Intime is 18:00:00 and Outtime is 21:00:00, so Dateout should display the next day date. 
In a fifth row – Holiday column value is yes, so it should not display any value in DateIn and DateOut 

Dateout столбец должен сравнить значение Интайма и Outtime, если Outtime меньше Интайма, столбец Dateout должен отобразить следующую дату дня.

Если отпуск = Да, то он должен отображаться как пустой колонке

Для приведенного выше условия, как сделать запрос SQL?

Возможно ли в vb.net, что является более быстрым sql-запросом или кодом vb.net?

Нужно SQL-запрос или код VB.NET для вышеуказанного условия.

ответ

1

Это похоже на работу (обратите внимание, что мои даты в формате США, так как именно там я :-)):

create table times 
    (
    Id    integer, 
    stDate   datetime, 
    InTime   datetime, 
    OutTime  datetime, 
    Holiday  varchar(3) 
    ) 
go 

insert into times values (001, '02-23-2009', '08:00:00', '17:00:00', 'no') 
insert into times values (001, '02-24-2009', '17:00:00', '08:00:00', 'no') 
insert into times values (001, '02-25-2009', '10:00:00', '16:00:00', 'no') 
insert into times values (001, '02-26-2009', '21:00:00', '20:00:00', 'no') 
insert into times values (001, '02-27-2009', null, null, 'yes') 
go 

select * from times 
go 

select 
    t.Id, 
    stDate, 
    InTime, 
    OutTime, 
    case 
     when Holiday = 'no' then stDate 
     else null 
    end  DateIn, 
    case 
     when InTime > OutTime and Holiday = 'no' then stDate + 1 
     when InTime < OutTime and Holiday = 'no' then stDate 
     else null 
    end  DateOut 
from 
    times t 

Результаты:

Id   stDate     InTime     OutTime     DateIn     DateOut     
---------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- 
1   2009-02-23 00:00:00.000 1900-01-01 08:00:00.000 1900-01-01 17:00:00.000 2009-02-23 00:00:00.000 2009-02-23 00:00:00.000 
1   2009-02-24 00:00:00.000 1900-01-01 17:00:00.000 1900-01-01 08:00:00.000 2009-02-24 00:00:00.000 2009-02-25 00:00:00.000 
1   2009-02-25 00:00:00.000 1900-01-01 10:00:00.000 1900-01-01 16:00:00.000 2009-02-25 00:00:00.000 2009-02-25 00:00:00.000 
1   2009-02-26 00:00:00.000 1900-01-01 21:00:00.000 1900-01-01 20:00:00.000 2009-02-26 00:00:00.000 2009-02-27 00:00:00.000 
1   2009-02-27 00:00:00.000 NULL     NULL     NULL     NULL      

5 Row(s) affected 
+0

Предположим, что Intime is 18:00:00 и Outtime - 21:00:00. Это означает, что Outime на следующий день, поэтому, как сделать запрос для этого условия. – Gopal

+0

Это условие не соответствует ни одному из ваших других критериев. Вы знаете, если вы просто пытаетесь найти дату и время окончания 8-часовой смены, вы уверены, что делаете это нелегко. Если вы знаете, когда начинается смена (начальная дата + время начала) - и вы знаете, что это 8-часовая смена, просто добавьте 8 часов к старту! Он пойдет на следующий день по мере необходимости. –

0

Вы можете использовать саз добавить день, когда OutTime меньше Интайма или отобразить пустую дату, когда это праздник:

select case 
    when holiday = 'yes' then '' 
    when OutTime < InTime then DateAdd(day,1,[Date]) 
    else [Date] 
    end as DateOut 
+0

Пусть Интайм 18:00: 00 и время ожидания 21:00:00. Это означает, что Outime на следующий день, поэтому, как сделать запрос для этого условия. – Gopal

+0

Недостаточно информации в таблице, чтобы принять это решение, поскольку это может быть как 3 часа, так и 27-часовой рабочий день. – Andomar

1

Я предлагаю:

SELECT t.id, 
     t.date_column, 
     t.intime, 
     t.outtime, 
     t.date AS datein, 
     CASE 
     WHEN t.outime < t.intime THEN 
      DATEADD(dd, 1, t.date) 
     ELSE 
      t.date 
     END AS dateout 
    FROM TABLE t 
WHERE t.holiday = 'no' 
UNION ALL 
SELECT h.id, 
     h.date_column, 
     NULL, 
     NULL, 
     NULL, 
     NULL 
    FROM TABLE h 
WHERE h.holiday = 'yes' 
ORDER BY date_column 

... но нет никакого способа узнать, действительно ли время простоя на следующий день (или больше). IE: intime of 1800 и outtime 2100 могут означать на следующий день.

+0

Точно, для примера Intime - 18:00:00, а Outtime - 21:00:00. Это означает, что Outime на следующий день, поэтому, как сделать запрос для этого условия – Gopal

+0

@Gopal: Это моя точка зрения - на основе столбцов, которые вы указали, нет никакого способа. Вам лучше отбросить столбец даты и использовать столбцы intime и outtime как DATETIME - только тогда вы точно знаете. –

+0

Если Intat и Outtime datatypes в качестве Datetime означает, как это изменится. Можете ли вы привести пример или идеи? – Gopal

Смежные вопросы