Что предпочтительный формат должен сохранить дату/времена в базе данных SQL Server, когда PHP является Вашим основным языком?

Требуются group by и having:

SELECT v.vendor_id
FROM vendors v  -- Shouldn't this be called vendorProducts ?
WHERE v.product_id IN (10, 20, 30, 40, 50) 
GROUP BY v.vendor_id
HAVING COUNT(DISTINCT v.product_id) = 5;

. Для нескольких поставщиков вы можете расширить вышеуказанную логику. Идея состоит в том, чтобы объединить таблицу, чтобы получить список пар поставщиков и всех продуктов, которые они вместе имеют. Затем выполните ту же логику, что и выше:

SELECT v.vendor_id1, v.vendor_id2
FROM (SELECT DISTINCT v1.vendor_id as vendor_id1, v2.vendor_id as vendor_id2,
             (CASE WHEN n.n = 1 THEN v1.product_id ELSE v2.product_id END) as product_id
      FROM vendors v1 JOIN
           vendors v2
           ON v1.product_id <> v2.product_id AND
              v1.vendor_id < v2.vendor_id CROSS JOIN
           (SELECT 1 as n UNION ALL SELECT 2) n
      UNION ALL
      -- Then include the singletons, just in case
      SELECT v.vendor_id, NULL, v.product_id
      FROM vendors v
     ) v
WHERE v.product_id IN (10, 20, 30, 40, 50) 
GROUP BY v.vendor_id1, v.vendor_id2
HAVING COUNT(DISTINCT v.product_id) = 5;

На самом деле вы можете выполнить фильтрацию товаров в подзапросе - чтобы сделать запрос более эффективным. Что касается того, чтобы сделать это более общим, «5» - это количество предметов. Я не знаю, как создается окончательный запрос.

РЕДАКТИРОВАТЬ II:

Это сложная проблема с большим количеством данных. Вот еще один подход, который может работать лучше, если у вас много продуктов и мало поставщиков:

select v1.*, v2.*
from (select vendor_id,
             max(product_id = 1) as p1,
             max(product_id = 2) as p2,
             max(product_id = 3) as p3,
             max(product_id = 4) as p4,
             max(product_id = 5) as p5,
      from vendors
      where product_id in (1, 2, 3, 4, 5)
      group by vendor_id
     ) v1 join
     (select vendor_id,
             max(product_id = 1) as p1,
             max(product_id = 2) as p2,
             max(product_id = 3) as p3,
             max(product_id = 4) as p4,
             max(product_id = 5) as p5,
      from vendors
      where product_id in (1, 2, 3, 4, 5)
      group by vendor_id
     ) v2
     on (v1.p1 + v2.p1) > 0 and
        (v1.p2 + v2.p2) > 0 and
        (v1.p3 + v2.p3) > 0 and
        (v1.p4 + v2.p4) > 0 and
        (v1.p5 + v2.p5) > 0;

Примечание. Если у одного поставщика есть все продукты, он будет отображаться в паре с любым другим поставщиком.

11
задан Andy Lester 22 October 2008 в 21:13
поделиться

3 ответа

Я сохранил бы даты в формате MS-SQL для помощи в использовании функций управления датой в T-SQL к их самому полному. Легче записать и читать

SELECT * FROM Foo
WHERE DateDiff(d,field1,now()) < 1

Чем попытаться выполнить эквивалентную операцию путем управления целыми числами

Для преобразования даты MsSQL в метку времени Unix используют dateDiff:

SELECT DATEDIFF(s,'1970-01-01 00:00:00',fieldName) as fieldNameTS
FROM TableName
WHERE fieldName between '10/1/2008' and '10/31/2008'

Для Преобразования Метки времени Unix в Дату MsSQL можно или сделать это в PHP:

$msSQLDate = date("Y-m-d H:i:s", $unixDate );

или в MsSQL

INSERT INTO TableName ( 
  fieldName
) VALUES (
  DATEADD(s,'1970-01-01 00:00:00', ? ) 
) 

Где параметр каждый является международным ($unixDate)

13
ответ дан 3 December 2019 в 06:23
поделиться

Я рекомендовал бы то же, как я делаю для всех дат в любом механизме дб, собственном типе дб. (ДАТА И ВРЕМЯ)

Просто используйте "YYYY-MM-DD HH:MM:SS" для вставки в php: date('Y-m-d H:i:s', $myTimeStampInSeconds);

- редактирование в ответ на комментарии ниже здесь -

  1. для выбранных столбцов можно использовать $timestamp = strtotime( $yourColumnValue );
  2. я рекомендую хранить в databas собственном формате, потому что можно затем использовать SQL для сравнения записей с помощью функций даты/времени SQL как DATEADD () и т.д.
4
ответ дан 3 December 2019 в 06:23
поделиться

Привет и хороший день для всех

Да, мог бы быть, это - лучший способ, даты хранилища в дб, они возьмут формат дб, и можно отформатировать, когда Вам нужно как Вы который

Но существует другой решение в разработанном из ISO международном формате даты, я имею в виду ISO 8601.

Международный формат, определенный ISO (ISO 8601), пытается решить все проблемы даты путем определения числовой системы дат следующим образом: YYYY-MM-DD, где

YYYY является годом [все цифры, т.е. 2100], MM является месяцем [01 (январь) к 12 (декабрь)], DD является днем [01 - 31] в зависимости от моли :P

Используя числовые даты действительно имеет также некоторые ловушки относительно удобочитаемости и удобства использования, это не прекрасно. Но формат даты ISO является, однако, лучшим выбором для представления даты, которое является универсально (и точно) понятно.

Обратите внимание, что этот формат может также использоваться для представления точной даты и времени с информацией о часовом поясе

Вот подробная информация о ISO 8601:2000

http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/date_and_time_format.htm

Без больше.... До свидания

2
ответ дан 3 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: