【问题标题】:LEFT Function in SQL Server returns no resultsSQL Server 中的 LEFT 函数不返回任何结果
【发布时间】:2019-02-21 20:31:15
【问题描述】:

我正在尝试将与某个月份对应的数据从 SQL 数据库中放入临时表中。

DROP TABLE
    #ComPAIR_Alliance_Table
SELECT
    IMOno
    ,period
    ,[service]
    ,alliances
INTO
    #ComPAIR_Alliance_Table
FROM
    com_COMPAIR.dbo.Data_BlueWaterCapacity_US_2
WHERE
    LEFT(period, 7) = '2015-03'

SELECT
     *
FROM #ComPAIR_Alliance_Table

句号字段格式如下:2015-03-29 00:00:00.000

但是,我的代码只返回一个空的临时表,其中包含正确的列名但没有行(即使我确定我的表中存在具有该日期的行)。我已经通过使用 is.numeric 确保句点列确实是一个字符串。

有人可以帮我解决可能是什么问题吗?

谢谢!

【问题讨论】:

  • period 的数据类型是什么?我敢打赌这是date
  • 句号是字符串吗?还是日期/时间列?请注意,您的查询是非 SARGable。
  • 我也尝试过使用 YEAR(period) = 2019 AND MONTH(period) = 09 但这也不起作用
  • 您不使用 ISNUMERIC 检查数据类型。你看表结构还是喜欢SELECT sql_variant_property(period, 'basetype')

标签: sql sql-server date datetime


【解决方案1】:

如果是日期/日期时间/日期时间2,那么您可以将其与2015-03 进行比较,例如:

WHERE period >= '2015-03-01'
AND   preiod <  DATEADD(MONTH, 1, '2015-03-01')

万一出现混淆:

  • 以上将匹配所有 2015 年 3 月的日期,例如 2015-03-312015-03-31 23:59:592015-03-31 23:59:59.9999999
  • 以上是可分析的:DATEADD 部分不依赖于表行

【讨论】:

  • 现在这有 2 票反对?我真的很想听听为什么。如果有人在这里有什么要补充的,请分享。 :)
【解决方案2】:

猜测Perioddate。如果是,请停止将其视为varchar,它不是一个。如果您想要 2015 年 3 月的值,请执行以下操作:

WHERE period >= '20150301'
  AND period < '20150401'

【讨论】:

  • 为什么会遭到反对?这与 Salman.A 的解决方案相同,两者同时发布。有人能解释一下吗?
【解决方案3】:

LEFT 做了一些奇怪的事情,因为 LEFT 导致从 Date 隐式转换为 String。您可以查看this question 以获取更多信息,但您得到的正是您告诉 SQL 获得的内容 - 加入句点左侧 7 个字符等于“2015-03”的行,这不会发生,因为您喜欢与“Jan 01”之类的内容进行比较

【讨论】:

    【解决方案4】:

    LEFT 函数需要将您的 datetime 列隐式转换为 varchar 值才能发挥作用。 SQL Server 根据其国际化设置选择日期的varchar 格式。在我的服务器上,它的Mar 29 2015 12:00AMLEFT 产生Mar 29。这就是为什么它不等于2015-03

    您应该将您的列视为日期时间,然后使用有效的日期时间比较执行比较,如下所示:

    WHERE period BETWEEN '1/1/2015' AND '1/31/2015'

    【讨论】:

    • 虽然您的答案可以带来正确的结果,但它仍然取决于语言环境并依赖于语言设置。这种格式是更安全的选择:WHERE period BETWEEN '20150101' AND '20150131'
    【解决方案5】:

    日期存储为日期类型。你可以试试

    where convert(varchar(20), period,121) 
    

    这会将其转换为字符串...

    【讨论】:

    • 并防止使用任何索引?这是一个非常糟糕的主意。
    猜你喜欢
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多