【问题标题】:SQL - format INT to date and add conditionSQL - 将 INT 格式化为日期并添加条件
【发布时间】:2016-07-13 06:33:43
【问题描述】:

我有一个带有日期列的表格。此列是一个 INT,包含格式为 YYYYMMDD 的日期(例如 20160713)。现在我想获取这些日期在今天之后的所有行。我尝试了以下方法:

SELECT ID, startdate, comment
FROM comments
WHERE startdate > getdate

但这会导致以下错误:

将表达式转换为数据类型日期时间时出现算术溢出错误。

所以我尝试将其格式化为 dd/mm/yyyy 格式

CONVERT(VARCHAR(10), (convert(date,CONVERT(varchar(10),[startdate],103))),103) > getdate()

但这会导致这个错误:

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

任何想法如何做到这一点?

【问题讨论】:

标签: sql sql-server date datetime


【解决方案1】:

尝试以下查询

SELECT 
    ID, 
    startdate, 
    comment
FROM 
    comments
WHERE 
    stadate > CAST(CONVERT(varchar(8),getdate(),112) AS INT)

【讨论】:

  • 我只是想知道如果我有 1000 行,那么 getdate() 将转换 1000 次还是仅转换一次?如果更多,最好使用变量,转换
  • 这种差异在实践中非常小,只有 1000 行。不过,如果查询运行了很多次或者超过数百万行,我认为您会开始注意到显着差异,但主要是由于重复的强制转换/转换。
【解决方案2】:

您可以尝试将 int 转换为日期值,但这意味着查询将无法使用您在 startdate 列上可能拥有的任何索引。
另一种选择是将 GETDATE() 返回的日期转换为与您的 int 格式匹配的 int 值:

DECLARE @Now datetime = GETDATE();
DECLARE @NowInt int =  YEAR(@Now) * 10000 + MONTH(@Now) * 100 + DAY(@Now);

SELECT ID, startdate, comment
FROM comments
WHERE startdate > @NowInt;

这样GetDate() 只执行一次,到int 的转换也只执行一次,并且您的查询可以使用startdate 上的索引(如果有的话)。

【讨论】:

    【解决方案3】:

    getDate 转换为int 更容易。

    cast(format(getDate(),'yyyyMMdd') as int) 
    

    【讨论】:

      【解决方案4】:

      试试这个:

      SELECT ID, startdate, comment
      FROM comments
      WHERE CAST(startdate AS DATE) > getdate()
      

      【讨论】:

      • 如果 startdate 真的是一个 int,它不会强制转换为 date,但应该是 CAST(CAST(startdate AS VARCHAR(8))) AS DATE)
      • As a number in either YYYYMMDD or YYMMDD format, provided that the number makes sense as a date. For example, 19830905 and 830905 are interpreted as '1983-09-05'.REFERENCE。 @AllanS.Hansen
      • 标签是sql server,不是mysql
      • 我明白你的意思@AllanS.Hansen。顺便说一句,这不是我的答案:p。虽然名字几乎相似。
      • 哈哈。必须是您的早期版本
      【解决方案5】:
      SELECT ID, startdate, comment
      FROM comments
      WHERE CAST(STR(startdate) AS DATE) > getdate()
      

      【讨论】:

      • 不要在列上应用函数。它会带来糟糕的表现
      【解决方案6】:

      不转换列,而是将 getdate() 转换为整数

      SELECT ID, startdate, comment
      FROM comments
      WHERE startdate > CONVERT(INT, CONVERT(VARCHAR(8), getdate, 112))
      

      我想其他人一定评论过使用错误的日期数据类型.....所以我不会提及任何内容:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 2019-04-21
        相关资源
        最近更新 更多