Извлечение даты из строки, приведение к дате и проверка на совпадение с сегодняшней датой - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть символьное поле, представляющее дату в следующем формате:

'yyyyMMdd-000000' 

Я не совсем уверен, что представляют собой нули, но я пытаюсь удалить их, а затем проверить, если дата совпадает с сегодняшней датой:

SELECT 
      acctnum,
      acctname
FROM 
     [Server].[dbo].[Table1]
Where 
    CAST(LEFT(myDate,8) AS DATE) = CAST(GetDate() as Date)

При выполнении этого оператора я получаю эту ошибку:

Преобразование не удалось при преобразовании даты и / или времени из символьной строки.

Что я делаю не так и как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Вместо этого используйте try_cast():

Where TRY_CAST(LEFT(myDate, 8) AS DATE) = CAST(GetDate() as Date)

Затем вы можете найти неверные данные, используя:

select myDate
from [Server].[dbo].[Table1]
Where TRY_CAST(LEFT(myDate, 8) AS DATE) is null;

Вы можете попытаться найти неверные данные, например:

select myDate
from [Server].[dbo].[Table1]
where mydate not like '[12][90][0-9][01][0-9][0-9][1-3][0-9]%'

Это не находит все плохие примеры, но если что-то бросается в глаза, оно выскочит.

0 голосов
/ 08 апреля 2020
declare @table1 table
(
    acctnum int,
    acctname varchar(10),
    myDate varchar(20)
)

insert into @table1(acctnum, acctname, myDate)
values(1, 'A', '20200401-000000'),
(2, 'B',  convert(varchar(20), getdate(), 112) + '-000000'),
(3, 'C',  convert(varchar(20), getdate(), 112) + '-000000'),
(4, 'D',  'abcd-0000');

select *
from @table1;

select *, case isdate(stuffdate) when 1 then cast(stuffdate as date) end
from
(
select *, stuff(stuff(stuff(myDate, 14, 0, ':'), 12, 0, ':'), 9, 1, ' ') as stuffdate
from @table1
where myDate like convert(varchar(20), getdate(), 112)+'%'
) as t;

select *
from
(
select *, stuff(stuff(stuff(myDate, 14, 0, ':'), 12, 0, ':'), 9, 1, ' ') as stuffdate
from @table1
) as t
where case isdate(stuffdate) when 1 then cast(stuffdate as date) end = convert(varchar(20), getdate(), 112);
...