2014-01-17 4 views
1

Я Нч следующую таблицу: -Преобразовать Дата и время

enter image description here

Мне нужно, чтобы преобразовать его в: -

enter image description here

ли принять к сведению, что дата TIMEINA должны следовать точно в соответствии с TIMEIN1. Что же касается времени, это будет исправлено т.е. 7.30, 8:30 утра и т.д.

Я попытался ниже SQL, но это не работает: -

enter image description here

Благодарности

+0

Добавлен тег SQL-сервер, потому что это явно SQL синтаксис сервера. –

+0

что такое тип данных TIMEIN1 и TIMEINA – Jade

+0

см. Мой ответ ниже. – Jade

ответ

1

Вы должны разместите свой код как код, а не как изображение.

В любом случае ваш код сравнивает datetime и имеет значение time. Просто сделайте конверсию. Вместо timein1 between . . . используйте:

cast(timein1 as time) between . . . 

EDIT:

О, вы также должны получить полную дату вне. Для этого используют арифметику datetime:

cast('07:30:00' as datetime) + cast(cast(timein1 as date) as datetime) 

Двойной cast на timein1 просто удалить компонент времени.

+0

Хорошо, это приведет меня к 7.30AM, 8.30AM и т. Д. Однако мне все еще нужно hv дата в формате YYYYMMDD HH: MM: SS. Дата основана на TIMEIN1. – Bob

+0

все в порядке, но есть некоторые проблемы. Например, TIMEIN1 20131208 00:00:00 будет отображаться как 1900-01-01 00:00:00. Мне нужно, чтобы это было 20131208 00:00:00. BTW, результаты в ГГГГ-ММ-ДД. Как я могу изменить его на YYYMMDD? – Bob

+0

ok, I hv исправил ошибку 1900-01-01 00:00:00, но как я могу сохранить ее в формате YYYMMDD. – Bob

0

Проверьте этот скрипт.

print replace(convert(nvarchar(25) , getdate(), 120), '-', '') -- yyyyMMdd HH:mm:ss 
print replace(convert(nvarchar(25) , getdate(), 102), '.', '') -- yyyyMMdd 
print convert(nvarchar(25) , getdate(), 108) -- HH:mm:ss 

здесь является T-SQL

SELECT [Day], 
     TIMEIN1, 
     TIMEOUT1, 
     DIVISION, 
     EMPLOYEE, 

     --IF TIMEIN1 is varchar 
     LEFT(TIMEIN1, 9) + 
     CASE 
      WHEN DIVISION = 'KEP' AND RIGHT(TIMEIN1, 8) BETWEEN '04:30:00' AND '07:29:59' 
       THEN '07:30:00' 
      WHEN DIVISION = 'KEP' AND RIGHT(TIMEIN1, 8) BETWEEN '17:30:00' AND '19:29:59' 
       THEN '19:30:00' 
      WHEN DIVISION = 'SER' AND RIGHT(TIMEIN1, 8) BETWEEN '04:30:00' AND '08:29:59' 
       THEN '08:30:00' 
      WHEN DIVISION = 'SER' AND RIGHT(TIMEIN1, 8) BETWEEN '17:30:00' AND '20:29:59' 
       THEN '20:30:00' 
      ELSE '00:00:00' 
     END AS TIMEINA 


     --IF TIMEIN1 is Date Time 
     , replace(convert(nvarchar(25) , TIMEIN1, 102), '.', '') + ' ' + 
     CASE 
      WHEN DIVISION = 'KEP' AND convert(nvarchar(25) , TIMEIN1, 108) BETWEEN '04:30:00' AND '07:29:59' 
       THEN '07:30:00' 
      WHEN DIVISION = 'KEP' AND convert(nvarchar(25) , TIMEIN1, 108) BETWEEN '17:30:00' AND '19:29:59' 
       THEN '19:30:00' 
      WHEN DIVISION = 'SER' AND convert(nvarchar(25) , TIMEIN1, 108) BETWEEN '04:30:00' AND '08:29:59' 
       THEN '08:30:00' 
      WHEN DIVISION = 'SER' AND convert(nvarchar(25) , TIMEIN1, 108) BETWEEN '17:30:00' AND '20:29:59' 
       THEN '20:30:00' 
      ELSE '00:00:00' 
     END AS TIMEINA 

FROM tempdb.dbo.TSA 

check this for more info

2

Основной вопрос у меня есть, сколько запросов идут к этой таблице?

Если вы выполняете эту сложную логику в одном отчете, тогда, во всяком случае, используйте SELECT.

Но это кричит мне для лучшего решения.

Почему бы не использовать вычисленную колонку?

Поскольку это дата и недетерминированность, вы не можете использовать сохраненное ключевое слово для физического хранения вычисленного значения.

Однако этот код будет указан только в определении таблицы, а не в каждом запросе.

Я сделал случай для первых двух диапазонов и двух образцов элементов даты. Остальное зависит от тебя.!

-- Just play 
use tempdb; 
go 

-- Drop table 
if object_id('time_clock') > 0 
drop table time_clock 
go 

-- Create table 
create table time_clock 
(
    tc_id int, 
    tc_day char(3), 
    tc_time_in datetime, 
    tc_time_out datetime, 
    tc_division char(3), 
    tc_empid char(5), 

    -- Use computed column 
    tc_time_1 as 
    (
    case 

     -- range 1 
     when 
     tc_division = 'KEP' and 
     cast(tc_time_in as time) between '04:30:00' and '07:29:59' 
     then 
     cast((convert(char(10), tc_time_in, 101) + ' 07:30:00') as datetime) 

     -- range 2 
     when 
     tc_division = 'KEP' and 
     cast(tc_time_in as time) between '17:30:00' and '19:29:59' 
     then 
     cast((convert(char(10), tc_time_in, 101) + ' 19:30:00') as datetime) 

     -- no match 
     else NULL 
    end 
    ) 
); 

-- Load store products 
insert into time_clock values 
(1,'SUN', '20131201 06:53:57', '20131201 16:23:54', 'KEP', 'A007'), 
(2,'TUE', '20131201 18:32:42', '20131201 03:00:47', 'KEP', 'A007'); 

-- Show the data 
select * from time_clock 

Ожидаемые результаты.

enter image description here

+0

+1 для 'Вычисленного столбца' – Fabio

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