首页 > 解决方案 > 我想将 varchar 日期列转换为日期以获取日期结果

问题描述

我想获得两个日期之间的结果输出,这些日期varchar(50)yyyy-mm-dd格式存储在我的 SQL 表中。实际上,我不知道下面提到的查询中的问题是什么,但它抛出了这个错误:

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

我的 SQL 选择查询是:

SELECT DISTINCT(bno), 
    name, cdate, ctime, 
    CAST(ISNULL(disc, '0') AS DECIMAL(18, 2)) AS 'Discount', 
    SUM(CASE WHEN ptype = 'Cash' THEN CAST(paid AS DECIMAL(18, 2)) END) AS 'Cash', 
    SUM(CASE WHEN ptype = 'Online' THEN CAST(paid AS DECIMAL(18, 2)) END) AS 'Online', 
    CAST(ISNULL(paid, '0') AS DECIMAL(18, 2)) AS 'GT' 
FROM
    Sales 
WHERE 
    bno != '0' 
    AND CONVERT(date, CONVERT(varchar(50), cdate, 105)) BETWEEN CONVERT(date, convert(varchar(50), '01-09-2020', 105)) 
                                                            AND CONVERT(date, CONVERT(varchar(50), '13-09-2020', 105)) 
GROUP BY
    bno, name, cdate, ctime, disc, paid

如果需要任何更正,请告诉我。提前致谢。

标签: sql-serverselect

解决方案


在我看来,您有多个问题。

  1. 您的 cdate 字段的格式为 yyyy-mm-dd 那么您的格式转换不准确。Tru 使用 try_cast
  2. 当您使用“案例说明”时,您也必须使用“其他”子句
  3. 您的“分组依据”必须使用与您的选择子句相同的字段/字段计算
  4. Distinct 在 group by 中总是多余的
  5. 当您的数据对于等待的类型不正确时,请使用 try_cast
  6. 您按 GT 付费分组,但您使用总和付费,而不是真正的逻辑
  7. 我怀疑你的 ctime 应该用在你的子句 where / between (cdate + ctime 可能是你的日期)

尝试这样的事情:

select bno, name, cdate, ctime,
TRY_CAST ( isnull(disc, '0') AS DECIMAL(18,2)) as 'Discount', 
sum(case when ptype = 'Cash' then TRY_CAST(paid AS DECIMAL(18,2)) else null end) as 'Cash', 
sum(case when ptype = 'Online' then TRY_CAST(paid AS DECIMAL(18,2)) else null end) as 'Online', 
sum(TRY_CAST(paid AS DECIMAL(18,2)) as 'GT'
from Sales 
where bno!='0' and 
Try_cast(cdate as date) between '2020-09-01' AND '2020-09-13'
group by bno, name, cdate, ctime, TRY_CAST ( isnull(disc, '0') AS DECIMAL(18,2))

如果您想在数据中找到所有问题,您可以这样做:

select bno, name, cdate, ctime, ptype, paid 
from Sales 
where bno!='0' and 
(
Try_cast( cdate as date) is null and cdate<>'' or
case when ptype = 'Cash' then TRY_CAST(paid AS DECIMAL(18,2)) else null end is null and ptype = 'Cash' and paid<>'' or
case when ptype = 'Online' then TRY_CAST(paid AS DECIMAL(18,2)) else null end is null and ptype = 'Online' and paid<>'' or
TRY_CAST ( isnull(disc, '0') AS DECIMAL(18,2)) is null and disc<>'' or
TRY_CAST ( isnull(paid, '0') AS DECIMAL(18,2)) is null and paid<>'' 
)

推荐阅读