【问题标题】:Stripping date from string, casting to date and checking if equal to today's date从字符串中删除日期,转换为日期并检查是否等于今天的日期
【发布时间】:2020-04-07 19:59:08
【问题描述】:

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

'yyyyMMdd-000000' 

我不完全确定 0 代表什么,但我试图去掉它们然后检查日期是否与今天的日期相同:

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

执行该语句时出现此错误:

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

我做错了什么,我该如何解决?

【问题讨论】:

  • 听起来您的某些值不是有效日期。这就是为什么将它们存储为 varchar 是一个坏主意。
  • 收拾桌子。将列数据类型更改为日期。
  • @Larnu 这很有道理。该表是从导入中填充的。在这种情况下通常会做什么?
  • 我的看法:(1) 正在将数据加载到适当数据类型的列中——在这里,听起来像DATE。 (2) 准备要加载的数据的过程执行数据清理例程,以确保所有要加载的数据格式正确(即实际上是日期)。 (3)实际加载数据的过程具有良好的错误处理能力,可以处理遇到的任何无效数据。这里的真正目标是在数据库中拥有干净且有效的数据——一旦正确加载,您就不必担心形式和格式,因为您会知道这很好。在加载时正确处理,而不是之后!

标签: sql sql-server sql-server-2008


【解决方案1】:

改用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]%'

这并没有找到所有不好的例子,但如果有什么东西很明显,它就会弹出。

【讨论】:

  • 不幸的是,该数据库是 SQL Server 2008 数据库。我猜这就是为什么我收到一条关于 try_cast 不是内置函数名称的消息。添加 And myDate null 使查询运行。
  • 另一个很好的理由让你摆脱完全不受支持的 SQL Server 版本,@Rich。
  • @Larnu 是的,但我无法控制。
【解决方案2】:
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);

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多