[英]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.