【问题标题】:Compare Datetime values on nvarchar columns in SQL比较 SQL 中 nvarchar 列上的日期时间值
【发布时间】:2017-06-01 02:09:04
【问题描述】:

在 SQL Azure 服务器数据库中,表有一个 nvarchar 列,其中包含字符串格式 (dd/MM/yyyy) 的日期值。例如03/11/2011

ARTICLE1 包含一些记录的空值。

以下是我目前尝试过的查询,但出现错误

将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围。

SQL 查询

select 
    [Code], concat(fname,' ',lname) as Name, [ARTICLE1] 
from 
    #T2 
where    
    CAST(ISNULL( [ARTICLE1], '1900-01-01') AS DATETIME) >= CONVERT(DATETIME, '31/01/1920', 103) 
    and CAST(ISNULL( [ARTICLE1] , '1900-01-01') AS DATETIME) <= CONVERT(DATETIME, '31/01/2017', 103) 
    and Category in ('STAFF', 'MANAGER')

【问题讨论】:

  • 你能检查一下ARTICLE1栏的日期时间格式吗?是 yyyy-dd-MM 还是 yyyy-MM-dd?
  • @DMayuri 我发现错误应该是转换而不是强制转换..它是 dd/mm/yyyy 格式
  • 为什么不在日期列中存储日期?它只会让你承受无限的痛苦。
  • @JonathanLeffler 由于表结构,我不能使用日期列,表结构是字段名,字段值(可以是任何字符串、整数或日期)
  • 运气不好。可怕的桌子设计。欢迎来到痛苦的世界!

标签: sql sql-server datetime


【解决方案1】:

我得到了解决方案,需要将字符串转换为日期时间而不是 CAST

select [Code],concat(fname,' ',lname) as Name,[ARTICLE1] From #T2 where    
 CONVERT( DATETIME, ISNULL( [ARTICLE1] , '1900-01-01'), 103 )  >= CONVERT( DATETIME, '31/01/1920', 103 ) and 
 CONVERT( DATETIME, ISNULL( [ARTICLE1] , '1900-01-01'), 103 )  <= CONVERT( DATETIME, '31/01/2017' , 103 ) and Category in ('STAFF','MANAGER')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多