簡體   English   中英

帶字符串時間的SQL查詢

[英]SQL Query with times in strings

我的數據庫中有這些表:

餐廳

  • restid (例如0)
  • name (例如Lokotas)

小時

  • hourid (例如0)
  • restid (例如0)
  • day (例如星期一)
  • time (例如7:00 PM-12:00 AM)

我不知道如何在實際的日期和時間檢查餐廳的營業時間。 阿索的最大問題是,有時一家餐廳在晚上7點開放,第二天凌晨1點關閉。

PD:我知道表“列時間”不是節省時間的最佳方法,但我不是這樣做的,我正在解決其他人的問題。

這是我令人費解的解決方案(對於T-SQL,不確定這是否是您正在使用的):

DECLARE @openhours NVARCHAR(30)
SET @openhours = '7:00 PM - 12:30 AM'

SELECT

    CONVERT(TIME, REVERSE(STUFF(REVERSE(CAST((SELECT CAST((
        SELECT SUBSTRING(left(@openhours,9), Number, 1)
        FROM master..spt_values
        WHERE Type='p' AND Number <= LEN(left(@openhours,9)) AND
            SUBSTRING(left(@openhours,9), Number, 1) LIKE '[0-9]' FOR XML Path(''))
    AS xml)) as VARCHAR(MAX))), 3, 0 , ':'))
    + CASE WHEN left(@openhours,9) LIKE '%PM%' THEN ' PM' ELSE ' AM' END) [Opens at],

    CONVERT(TIME, REVERSE(STUFF(REVERSE(CAST((SELECT CAST((
        SELECT SUBSTRING(right(@openhours,9), Number, 1)
        FROM master..spt_values
        WHERE Type='p' AND Number <= LEN(right(@openhours,9)) AND
            SUBSTRING(right(@openhours,9), Number, 1) LIKE '[0-9]' FOR XML Path(''))
    AS xml)) as VARCHAR(MAX))), 3, 0 , ':'))
    + CASE WHEN right(@openhours,9) LIKE '%PM%' THEN ' PM' ELSE ' AM' END) [Closes at]

注意,您不必聲明和設置變量。 您可以省略這兩行,並用任何包含您的開放時間字符串的列名稱替換我在@openhours中使用過的所有位置。

如果您不希望將值作為TIME返回,而是希望使用VARCHAR ,則只需刪除外部的CONVERT(TIME, ... ... ... )函數。 但是,轉換為TIME的好處是現在您可以使用DB函數對結果進行計算(例如B-A,查看商店的開放時間等)。

我從Chris Hynes博客文章中大量借用了SQL Server中從字符串中去除非數字字符的信息,然后從那里將輸出轉換為DB可讀的TIME 希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM