Sql 从时间间隔转换为语句

Sql 从时间间隔转换为语句,sql,sql-server,Sql,Sql Server,我试图将数据库中的时间值更改为语句。例如,06:00:00到12:00:00之间的时间间隔为上午,12:00:00到17:00:00之间的时间间隔为下午,依此类推。我使用的是这样的方法: Update dbo.denouncement_term_day_time Set time_den = 'Morning' WHERE (DATEPART(HOUR, time_den) >= 6 AND DATEPART(MINUTE, time_den) >= 00 AND DAT

我试图将数据库中的时间值更改为语句。例如,06:00:00到12:00:00之间的时间间隔为上午,12:00:00到17:00:00之间的时间间隔为下午,依此类推。我使用的是这样的方法:

Update dbo.denouncement_term_day_time

Set time_den = 'Morning'

WHERE (DATEPART(HOUR, time_den) >= 6
  AND DATEPART(MINUTE, time_den) >= 00
  AND DATEPART(SECOND, time_den) >= 00) AND
  (DATEPART(HOUR, time_den) <= 11
  AND DATEPART(MINUTE, time_den) <= 59
  AND DATEPART(SECOND, time_den) <= 59)
更新dbo.discountment\u term\u day\u time
设置时间=上午
其中(日期部分(小时,时间)>=6
和日期部分(分钟、时间)>=00
和日期部分(秒,时间>00)和
(DATEPART(小时,时间)试试这个-

ALTER TABLE dbo.denouncement_term_day_time
    ADD time_den_new VARCHAR(20) NULL
GO

UPDATE dbo.denouncement_term_day_time
SET time_den_new = 
        CASE WHEN time_den BETWEEN '6:00:00' AND '11:59:59' THEN 'Morning'
             WHEN time_den BETWEEN '12:00:00' AND '16:59:59' THEN 'Afternoon'
        END
WHERE time_den BETWEEN '6:00:00' AND '16:59:59'
GO

ALTER TABLE dbo.denouncement_term_day_time DROP COLUMN time_den
GO

EXEC sp_rename 'dbo.denouncement_term_day_time.time_den_new', 'time_den', 'COLUMN'
试试这个-

ALTER TABLE dbo.denouncement_term_day_time
    ADD time_den_new VARCHAR(20) NULL
GO

UPDATE dbo.denouncement_term_day_time
SET time_den_new = 
        CASE WHEN time_den BETWEEN '6:00:00' AND '11:59:59' THEN 'Morning'
             WHEN time_den BETWEEN '12:00:00' AND '16:59:59' THEN 'Afternoon'
        END
WHERE time_den BETWEEN '6:00:00' AND '16:59:59'
GO

ALTER TABLE dbo.denouncement_term_day_time DROP COLUMN time_den
GO

EXEC sp_rename 'dbo.denouncement_term_day_time.time_den_new', 'time_den', 'COLUMN'

我几乎不知道从哪里开始

  • 为什么要在varchar()字段上多次调用DATEPART?这需要先隐式转换为datetime类型,这将非常昂贵。最好将字符串转换为datetime,然后再从那里开始工作

  • 不要在数据库中存储“Morning”等。请使用CASE根据datetime值导出友好值。您可以直接在SELECT中执行此操作,也可以在视图中将其抽象出来

  • 在此字段上调用DATEPART()还意味着您将来肯定会出错,因为您将在日期/时间字符串的位置设置回“Morning”之类的字符串

  • DATEPART(分钟,x)>=0和DATEPART(秒,x)>=0将始终返回true。不存在负分钟或负秒

  • 同样,11:59:59的最后一次比较可以简化为DATEPART(HOUR,d)<12.Boom。不需要看分或秒。(这也处理分数秒,您可能不会以字符串形式处理分数秒。)

  • 核心问题是varchar()字段中的某些内容不是可以隐式转换回的日期/时间

    我的解决方案,使用计算列:

      -- Add a new column for the proper datetime values.
      ALTER TABLE denouncement_term_day_time ADD datetime_den datetime;
      -- Clean your data before running the next line.
      UPDATE denouncement_term_day_time SET datetime_den = CAST(time_den AS datetime);
      -- Once converted, don't store the string dates anymore, it's wasteful
      ALTER TABLE denouncement_term_day_time DROP COLUMN time_den;
      -- Add a computed column to return the friendly time.
      ALTER TABLE denouncement_term_day_time ADD friendly_time AS
            CASE
              WHEN DATEPART(HOUR, datetime_den) > 16 THEN 'Evening'
              WHEN DATEPART(HOUR, datetime_den) > 11 THEN 'Afternoon'
              ELSE 'Morning'
            END
    

    然而,即使这样也有问题,因为它假设用户与数据处于同一时区。理想情况下,这种事情应该在UI层中完成,在UI层中,您可以访问用户的位置、语言等,而不是深入到您的数据层中。

    我几乎不知道从何处开始

  • 为什么要在varchar()字段上多次调用DATEPART?这需要先隐式转换为datetime类型,这将非常昂贵。最好将字符串转换为datetime,然后再从那里开始工作

  • 不要在数据库中存储“Morning”等。请使用CASE根据datetime值导出友好值。您可以直接在SELECT中执行此操作,也可以在视图中将其抽象出来

  • 在此字段上调用DATEPART()还意味着您将来肯定会出错,因为您将在日期/时间字符串的位置设置回“Morning”之类的字符串

  • DATEPART(分钟,x)>=0和DATEPART(秒,x)>=0将始终返回true。不存在负分钟或负秒

  • 同样,11:59:59的最后一次比较可以简化为DATEPART(HOUR,d)<12.Boom。不需要看分或秒。(这也处理分数秒,您可能不会以字符串形式处理分数秒。)

  • 核心问题是varchar()字段中的某些内容不是可以隐式转换回的日期/时间

    我的解决方案,使用计算列:

      -- Add a new column for the proper datetime values.
      ALTER TABLE denouncement_term_day_time ADD datetime_den datetime;
      -- Clean your data before running the next line.
      UPDATE denouncement_term_day_time SET datetime_den = CAST(time_den AS datetime);
      -- Once converted, don't store the string dates anymore, it's wasteful
      ALTER TABLE denouncement_term_day_time DROP COLUMN time_den;
      -- Add a computed column to return the friendly time.
      ALTER TABLE denouncement_term_day_time ADD friendly_time AS
            CASE
              WHEN DATEPART(HOUR, datetime_den) > 16 THEN 'Evening'
              WHEN DATEPART(HOUR, datetime_den) > 11 THEN 'Afternoon'
              ELSE 'Morning'
            END
    
    然而,即使这样也有问题,因为它假设用户与数据处于同一时区。理想情况下,这种事情应该在UI层中完成,在UI层中,您可以访问用户的位置、语言等,而不是深入到数据层中。

    尝试一下

    Update dbo.denouncement_term_day_time
       Set time_den = 'Morning'
    WHERE (DATEPART(HOUR,  Convert(DATETIME, [time_den]), 8)) >= 6
    AND DATEPART(MINUTE,  Convert(DATETIME, [time_den]), 8)) >= 00
    AND DATEPART(SECOND,  Convert(DATETIME, [time_den]), 8)) >= 00) 
    AND ( DATEPART(HOUR,  Convert(DATETIME, [time_den]), 8)) <= 11
    AND DATEPART(MINUTE,  Convert(DATETIME, [time_den]), 8)) <= 59
    AND DATEPART(SECOND,  Convert(DATETIME, [time_den]), 8)) <= 59)
    
    更新dbo.discountment\u term\u day\u time
    设置时间=上午
    其中(DATEPART(HOUR,Convert(DATETIME,[时间]),8))>=6
    和DATEPART(分钟,转换(DATETIME,[time_den]),8))>=00
    和DATEPART(第二个,Convert(DATETIME,[time_den]),8))>=00)
    和(DATEPART(HOUR,Convert(DATETIME,[time\u den]),8))试试这个

    Update dbo.denouncement_term_day_time
       Set time_den = 'Morning'
    WHERE (DATEPART(HOUR,  Convert(DATETIME, [time_den]), 8)) >= 6
    AND DATEPART(MINUTE,  Convert(DATETIME, [time_den]), 8)) >= 00
    AND DATEPART(SECOND,  Convert(DATETIME, [time_den]), 8)) >= 00) 
    AND ( DATEPART(HOUR,  Convert(DATETIME, [time_den]), 8)) <= 11
    AND DATEPART(MINUTE,  Convert(DATETIME, [time_den]), 8)) <= 59
    AND DATEPART(SECOND,  Convert(DATETIME, [time_den]), 8)) <= 59)
    
    更新dbo.discountment\u term\u day\u time
    设置时间=上午
    其中(DATEPART(HOUR,Convert(DATETIME,[时间]),8))>=6
    和DATEPART(分钟,转换(DATETIME,[time_den]),8))>=00
    和DATEPART(第二个,Convert(DATETIME,[time_den]),8))>=00)
    
    和(DATEPART(HOUR,Convert(DATETIME,[time_den]),8))请根据您使用的sql风格添加一个标记(例如mysql)。您可以通过底部的编辑链接来完成这项工作。要做什么,请根据您使用的sql的风格(例如mysql)添加一个标记。您可以使用底部的“编辑”链接来执行此操作。要执行的操作点是
    和DATEPART(分钟,时间)>=00
    和DATEPART(分钟,时间)=6和(DATEPART(小时,时间)谢谢,但这一点给出了“DATEPART函数需要2个参数”错误。很抱歉,您可以尝试更新dbo.declaument\u term\u day\u time Set[time\u den]=“Morning”其中(DATEPART(HOUR,CONVERT(Char(8),CONVERT(DATETIME,[time\u den]),8))>=6和DATEPART(MINUTE,CONVERT(Char(8),CONVERT(DATETIME,[time\u den]),8))>=00和DATEPART(SECOND,CONVERT(Char(Char(Char(8),CONVERT(DATETIME,[time,[time\u den]),8))>=00)和(DATEPART(HOUR,CONVERT(Char(8),CONVERT(DATETIME,[time_den]),8))谢谢,但这一个给出了“DATEPART函数需要2个参数”错误。很抱歉,您可以尝试更新dbo.declaument\u term_day_time Set[time_den]=“Morning”WHERE(DATEPART(HOUR,CONVERT(Char(8),CONVERT(DATETIME,[time_den]),8))>=6和日期部分(分钟,转换(字符(8),转换(日期时间,[时间]),8))>=00和日期部分(秒,转换(字符(8),转换(日期时间,[时间]),8))>=00和(日期部分(小时,转换(字符(8),转换(日期时间,[时间]),8))是的,你是对的,这不是一个好方法。但我是一个完全的初学者,我需要在ms sql数据工具中分析数据的项目中这样做。因此,我不会再使用它。非常感谢