【问题标题】:Using date of type char in where clause在 where 子句中使用 char 类型的日期
【发布时间】:2010-10-27 22:38:44
【问题描述】:

我有一个 SQL Server 数据库表,其中有一个名为“DATE”的 char 列(我知道,这很糟糕,但我没有创建数据库),其中日期以这种格式存储为字符串:YYMMDD。我需要返回这些日期之间的记录,因此将它们视为实际日期,并且我已经尝试了我知道的所有组合,但仍然出现错误。任何帮助深表感谢。我已经尝试了所有这些都没有运气:

SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), [DATE], 112) AS datetime) BETWEEN '100401' AND '101001'
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), [DATE], 12) AS datetime) BETWEEN '100401' AND '101001'
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), "DATE", 112) AS datetime) BETWEEN '100401' AND '101001'
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), "DATE", 12) AS datetime) BETWEEN '100401' AND '101001'
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), [DATE], 112) AS datetime) >= 100401 AND CAST(CONVERT(char(8), [DATE], 112) AS datetime) <= 101001
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), [DATE], 12) AS datetime) >= 100401 AND CAST(CONVERT(char(8), [DATE], 12) AS datetime) <= 101001
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), "DATE", 112) AS datetime) >= 100401 AND CAST(CONVERT(char(8), "DATE", 112) AS datetime) <= 101001
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), "DATE", 12) AS datetime) >= 100401 AND CAST(CONVERT(char(8), "DATE", 12) AS datetime) <= 101001
SELECT * FROM caddb..INCIDENT WHERE CAST([DATE] AS INT) >= 100401 AND CAST([DATE] AS INT) < 101001
SELECT * FROM caddb..INCIDENT WHERE CAST("DATE" AS INT) >= 100401 AND CAST("DATE" AS INT) < 101001
SELECT * FROM caddb..INCIDENT WHERE CAST([DATE] AS INT) BETWEEN 100401 AND 101001
SELECT * FROM caddb..INCIDENT WHERE CAST("DATE" AS INT) BETWEEN 100401 AND 101001

【问题讨论】:

    标签: sql sql-server date char where-clause


    【解决方案1】:

    这里有几件事:

    • 您可以在 CAST 和 CONVERT 之间进行选择,但不能同时选择两者
    • 在您的情况下,CONVERT 更合适,因为您可以指定确切的格式 (12)。如果字符串没有像 101231 这样的世纪,则使用 12;如果字符串有像 20101231 这样的世纪,则使用 112
    • 使用 CONVERT 时,您指定所需的数据类型,而不是原始 var 的数据类型
    • 如果您键入像 '2010-10-28' yyyy-MM-dd 这样的字符串文字,MS SQL 可以将字符串文字识别为日期时间

    所以,你可以做类似的事情

    convert(datetime, [DATE], 12) between '2010-10-01' and '2010-10-10'
    

    【讨论】:

    • 你尝试了什么?我想帮忙,但如果你只是说这不起作用,没人会理解你的问题。
    【解决方案2】:

    试试这个。您需要将所有字段和常量转换为 DATETIME 数据类型。

    SELECT * 
    FROM caddb..INCIDENT 
    WHERE CONVERT(datetime, "DATE", 112) BETWEEN CONVERT(datetime, '100401', 112) and CONVERT(datetime, '101001', 112)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多