Удаление строк на основе сравнения дат — sql

#sql-server-2008 #tsql

#sql-server-2008 #tsql

Вопрос:

Я пишу SQL-скрипт для удаления некоторых строк из моей таблицы.

Мне нужно удалить строки, которые имеют определенный тип (легко), где временная метка оценки равна 16:00 текущего дня, когда дата создания меньше 4 вечера. Имеет ли это смысл?

 delete from cfo_daily_trans_hist where dh_dd_type_id = 'valuation' --and dh_val_time_stamp is today at 16:00 where the dh_create_dt is today at a time earlier than 16:00
 

Я просто не знаю синтаксиса для точного сравнения дат.

Спасибо, ребята.

Ответ №1:

 DELETE [dbo].[cfo_daily_trans_hist]
WHERE [dh_dd_type_id] = 'valuation' 
AND [dh_val_time_stamp] = DATEADD(HH, 16, CONVERT(DATETIME,CONVERT(DATE,GETDATE()))) -- is today at 16:00 
AND [the dh_create_dt] < DATEADD(HH, 16, CONVERT(DATETIME,CONVERT(DATE,GETDATE())))-- is today at a time earlier than 16:00
 

Комментарии:

1. Это даст мне не только строки 16:00, верно? Разве это не даст мне строку, если она имеет значение 16:30? Мы хотим удалить их только в том случае, если для части value_dt точно 16:00

2. Я использую AND в WHERE предложении, поэтому запрос будет удалять только строки, соответствующие всем условиям.

3. Существует дополнительный критерий для dh_create_dt, который должен быть сегодня до 16:00. Этот запрос (как написано) позволит dh_create_dt принимать любое значение до 16:00 в любой день до сегодняшнего дня.

4. Хорошая точка @GMastros, вам понадобится другой предикат для ограничения [dh_create_dt] до 1600 часов сегодня , как в вашем ответе: AND [dh_create_dt] >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) .

Ответ №2:

 And dh_val_time_stamp = DateAdd(Hour, 16, DateAdd(Day, DateDiff(Day, 0, GetDate()), 0))
And dh_create_dt >= DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)
And dh_create_dt < DateAdd(Hour, 16, DateAdd(Day, DateDiff(Day, 0, GetDate()), 0))
 

Ответ №3:

 -- =================
-- sample data
-- =================
declare @t table
(
    dh_val_time_stamp datetime,
    dh_create_dt datetime
)

declare @d datetime
set @d = cast(cast(cast(getdate() as float) as int) as datetime)

insert into @t values (dateadd(hh, 16, @d), dateadd(hh, 14, @d))
insert into @t values (dateadd(hh, 1, @d), dateadd(hh, 2, @d))


-- =================
-- solution
-- =================
select 
    *
from @t t1
cross apply
(
    select d = dateadd(hh, 16, cast(cast(cast(getdate() as float) as int) as datetime))
) t2
where dh_val_time_stamp = d
and dh_create_dt < d