Sql 从字符串中提取日期,铸造到日期,并检查是否等于今天';日期

Sql 从字符串中提取日期,铸造到日期,并检查是否等于今天';日期,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个字符字段,表示以下格式的日期: 'yyyyMMdd-000000' 我不完全确定0代表的是什么,但我正在尝试去掉这些,然后检查日期是否与今天的日期相同: SELECT acctnum, acctname FROM [Server].[dbo].[Table1] Where CAST(LEFT(myDate,8) AS DATE) = CAST(GetDate() as Date) 执行该语句时,我得到以下错误: 从字符串转换日期和/或

我有一个字符字段,表示以下格式的日期:

'yyyyMMdd-000000' 
我不完全确定0代表的是什么,但我正在尝试去掉这些,然后检查日期是否与今天的日期相同:

SELECT 
      acctnum,
      acctname
FROM 
     [Server].[dbo].[Table1]
Where 
    CAST(LEFT(myDate,8) AS DATE) = CAST(GetDate() as Date)
执行该语句时,我得到以下错误:

从字符串转换日期和/或时间时,转换失败

我做错了什么?如何修复此问题?

使用
try\u 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]%'

这并不是说所有的例子都不好,但是如果有什么东西很显眼,它就会弹出。

听起来你的一些值不是有效的日期。这就是为什么将它们存储为
varchar
是个坏主意。请清理表。将列数据类型改为date。@这很有意义。该表是通过导入填充的。在这种情况下通常会做什么?我的观点是:(1)数据被加载到一个适当数据类型的列中——在这里,听起来像
DATE
。(2) 准备要加载的数据的过程执行数据清理例程,以确保加载的所有数据的格式正确(即,实际上是一个日期)。(3) 实际加载数据的过程具有良好的错误处理能力,可以处理遇到的任何无效数据。这里的真正目标是在数据库中拥有干净有效的数据——一旦正确加载,您就不必担心形式和格式,因为您会知道这很好。在加载时进行正确操作,而不是在加载之后!不幸的是,该数据库是SQL Server 2008数据库。我猜这就是为什么我收到一条消息说try_cast不是一个内置函数名。添加和myDate null使查询运行。另一个摆脱完全不受支持的SQL Server版本的好理由是,@Rich@Larnu True,但我无法控制。
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);