我想将其转换以用于比较数据,并且在这里我被困住了。
我在日期列中有数据,例如10-09-2020
where convert(varchar, date, 111) >= '2020-09-10'
AND convert(varchar, date, 111) <= '2020-09-10'
我也在111的位置尝试过43
答案 0 :(得分:2)
如果您有日期,请不要将其转换为字符串:而是将其与日期进行比较:
where date >= '20200910'
YYYYMMDD
是SQL Server中代表日期的最安全的字符串格式。
修改
如果您以DD-MM-YYYY
格式将日期存储为字符串,则可以先将它们转换为日期,然后进行比较:
where datefromparts(right(date_string, 4), substring(date_string, 4, 2), left(date_string, 2)) >= '20200910'
您应该考虑更改数据模型以使用适当的数据类型。将日期存储为字符串对于数据的完整性而言效率低下且不安全。有关如何继续转换列的数据类型,请参见Larnu的答案。
答案 1 :(得分:1)
该问题下的注释中显示的 real 问题是这样的:
日期存储为varchar
将日期存储为varchar
总是 是错误的做法。您需要修复您的设计。这可以通过以下方式实现:
UPDATE dbo.YourTable
SET YourDate = REPLACE(YourDate, '-'. '/');
UPDATE dbo.YourTable
SET YourDate = CONVERT(varchar(8),CONVERT(date,YourDate, 103),112);
GO
ALTER TABLE dbo.YourTable ALTER COLUMN YourDate date;
请注意,您可能需要在第二个UPDATE
中更改样式,因为我将 假定 dd-MM-yyyy
作为格式。
如果仍然失败,则表明数据中有错误数据(另一个原因,varchar
是数据类型的错误选择)。您可以使用以下内容(再次使用适当的样式代码)找出不良行:
SELECT YourDate
FROM dbo.YourTAble
WHERE TRY_CONVERT(date,YourDate, 103) IS NULL;
您需要修复这些值,然后才能运行上述值。
最后,您将可以使用GMB的解决方案来获得所需的结果。
答案 2 :(得分:0)
如果您的列是使用本机类型存储的,则无需进行转换。如果它还不是date
,则将其转换:
where convert(date, datecol) = '2020-09-10'
有一个国际化设置将其解释为YYYY-DD-MM。尽管我对连字符没问题,但最好是:
where convert(date, datecol) = '20200910'
如果值存储为字符串,则不清楚'10-09-2020'
是DD-MM-YYYY还是MM-DD-YYYY。因此,您应该使用以下之一:
try_convert(date, datecol, 110) -- for mm-dd-yyyy
try_convert(date, datecol, 105) -- for dd-mm-yyyy
请注意,这使用了try_convert()
。如果日期存储为字符串,则不能确保值正确。您可能想查看是否有任何无效值。