sql-server - 我想将 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
如果需要任何更正,请告诉我。提前致谢。
解决方案
在我看来,您有多个问题。
- 您的 cdate 字段的格式为 yyyy-mm-dd 那么您的格式转换不准确。Tru 使用 try_cast
- 当您使用“案例说明”时,您也必须使用“其他”子句
- 您的“分组依据”必须使用与您的选择子句相同的字段/字段计算
- Distinct 在 group by 中总是多余的
- 当您的数据对于等待的类型不正确时,请使用 try_cast
- 您按 GT 付费分组,但您使用总和付费,而不是真正的逻辑
- 我怀疑你的 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<>''
)
推荐阅读
- javascript - 在 Mozilla Firefox 中跟踪 URL
- javascript - 我的 sqlite 项目在添加到表时不断抛出错误
- signal-processing - STM32硬件设备日期类型和DSP库数据类型,转换负载价格
- java - 为什么这个方法(setRefreshToken)未定义?
- angular - 在 Angular 中使用 Auth0 的 AuthHttpInterceptor 时,如何将 URL 与参数匹配?
- javascript - Django 和 JavaScript:在 Javascript 文件中的对象列表中使用最后上传的文件
- python - 无法使用 subprocess.run 获得预期结果
- python-3.x - 将两个不相等的列表放入字典中。如果 key 没有值,则不给出。忽略值没有键 - python
- python - python kivy从firebase获取数据以便能够滚动它
- wordpress - 无法提供目录 /var/www/html/:没有匹配的 DirectoryIndex (Docker / Wordpress)