SQL中的日期转换,从10-09-2020到2020-09-10

时间:2020-09-10 09:50:08

标签: sql sql-server string datetime where-clause

我想将其转换以用于比较数据,并且在这里我被困住了。

我在日期列中有数据,例如10-09-2020

where convert(varchar, date, 111) >= '2020-09-10'
  AND convert(varchar, date, 111) <= '2020-09-10' 

我也在111的位置尝试过43

3 个答案:

答案 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()。如果日期存储为字符串,则不能确保值正确。您可能想查看是否有任何无效值。