【问题标题】:Date conversion in SQL from 10-09-2020 to 2020-09-10SQL 中从 10-09-2020 到 2020-09-10 的日期转换
【发布时间】:2020-09-10 09:50:08
【问题描述】:

我想将其转换为比较数据&这里我卡住了。

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

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

我在 111 的地方也尝试了 43

【问题讨论】:

  • 您使用的是 MySQL 还是 MS SQL Server? (该代码不适用于两者。)
  • 为什么要将您的日期转换为字符串 - 只是为了比较?没有意义 - 只需比较 where date &gt;= '20200910' and date &lt;= '20200930' 或您需要的任何内容。我建议使用中性语言 YYYYMMDD 格式 - 总是。
  • "日期存储为 varchar" 你的问题就在那里。
  • @AwaisUsmani no,CONVERT 需要 2 或 3 个参数。 CONVERT (Transact-SQL)。要转换的数据类型、要转换的值和(可选)样式代码。自从它在 T-SQL 中引入以来就是这样。 includes 早在 1992 年的 SyBase 中:CONVERT function [Data type conversion]

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


【解决方案1】:

如果您有日期,请不要将其转换为字符串:将其作为日期进行比较:

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 的回答,了解如何继续转换列的数据类型。

【讨论】:

  • 日期存储为 10-09-2020 这种格式为 varchar。所以我需要转换。从客户端,我可以将输入转换为您喜欢的格式,但如何将数据列成这种格式
【解决方案2】:

这里的真正的问题,在问题下的cmets中揭示出来的,是这样的:

日期存储为 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 的解决方案来获得您想要的结果。

【讨论】:

  • 嗨朋友我知道这是一个问题,但我无法从我身边改变它。我知道如何改变,但这是不可能的
  • 为什么不可能,@ROHITNEHRA?修复设计是这里唯一正确的解决方案。否则,您的数据库本身就有缺陷。根据你的数据库,例如,“日期”'10/09/2020'之前 '11/01/2009';实际上,第一个值在 之后超过 11 年(或者可能略低于 9 月 10 日或 10 月 9 日,我们不知道)。修复设计,修复问题。
  • 这里只允许使用SELECT语句。我也提出了这个解决方案,但不允许这样做,因为日期是印度可以理解的格式,这里不允许干涉。
  • date 数据类型比表示一个字符串@ROHITNEHRA 更容易理解。我可以向你保证,在任何国家/地区都没有'10/09/2020' 之前 '11/01/2009'。如果使用 WHERE YourDate &gt;= '10/09/2020' 进行查询是没有意义的,并且您会获得多年前的数据。
  • 我知道我们可以理解这是没有意义的,但公司需要解决方案而不提供输入。这就是问题所在。
【解决方案3】:

如果您的列是使用本机类型存储的,则无需转换。如果还不是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()。如果日期存储为字符串,则无法确定值是否正确。您可能想查看是否有任何无效值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多