Выберите данные из дБ SQL в день

Я перенес бы карту в статическом объекте и поместил бы код инициализации карты в конструктора этого объекта, этот способ, которым Вы уверены, карта создается, прежде чем код инициализации выполнен.

7
задан MartinHN 13 August 2009 в 20:25
поделиться

9 ответов

Вы неправильное использование API. Не обижайтесь, сначала это сбивает с толку.

Обе эти строки говорят виджету datepicker инициализировать datepicker для элемента:

$("#datepicker").datepicker();
$('#datepicker').datepicker({
   onSelect: function(dateText, inst) { alert("Working"); }
});

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

Если вы хотите изменить значение одного из параметров после того, как вы уже инициализировали виджет, вам нужно будет использовать этот api:

$('#datepicker').datepicker('option', 'onSelect', function() { /* do stuff */ });

Или, альтернативно, (украдено с http://www.codeproject.com/KB/database/GenerateDateTable.aspx )

Create Function dbo.fnDateTable
(
  @StartDate datetime,
  @EndDate datetime,
  @DayPart char(5) -- support 'day','month','year','hour', default 'day'
)
Returns @Result Table
(
  [Date] datetime
)
As
Begin
  Declare @CurrentDate datetime
  Set @CurrentDate=@StartDate
  While @CurrentDate<=@EndDate
  Begin
    Insert Into @Result Values (@CurrentDate)
    Select @CurrentDate=
    Case
    When @DayPart='year' Then DateAdd(yy,1,@CurrentDate)
    When @DayPart='month' Then DateAdd(mm,1,@CurrentDate)
    When @DayPart='hour' Then DateAdd(hh,1,@CurrentDate)
    Else
      DateAdd(dd,1,@CurrentDate)
    End
  End
  Return
End

Затем присоединитесь к этой таблице

SELECT dates.Date as Date, sum(SubTotal+TaxAmount+ShippingAmount)
FROM [fnDateTable] (dateadd("m",-1,CONVERT(VARCHAR(10),GETDATE(),111)),CONVERT(VARCHAR(10),GETDATE(),111),'day') dates 
LEFT JOIN Orders
ON dates.Date = DateCreated
GROUP BY dates.Date
2
ответ дан 7 December 2019 в 12:23
поделиться

У меня есть таблица таблицы журнала с LogID индексом, который я никогда не удаляю записи. он имеет индекс от 1 до ~ 10000000. Используя эту таблицу, я могу написать

select 
     s.ddate, SUM(isnull(o.SubTotal,0))
from 
    (
        select 
            cast(datediff(d,LogID,getdate()) as datetime) AS ddate 
        from
            Log 
        where 
            LogID <31
    ) s right join orders o on o.orderdate = s.ddate
group by s.ddate
1
ответ дан 7 December 2019 в 12:23
поделиться

Я действительно сделал это сегодня. У нас также есть приложение для электронной коммерции. Не хочу забивать нашу базу «бесполезными» датами. Я просто группирую и создаю все дни за последние N дней на Java и сравниваю их с результатами даты / продаж из базы данных.

0
ответ дан 7 December 2019 в 12:23
поделиться

Чем это в конечном итоге закончится? Я спрашиваю только потому, что может быть проще заполнить пустые дни любой программой, которая будет работать с данными, вместо того, чтобы пытаться сделать это на SQL.

SQL - замечательный язык, и он способен на отличные много вещей, но иногда лучше работать с более точными данными в программе.

0
ответ дан 7 December 2019 в 12:23
поделиться

Я создал таблицу функций DateTable, как указал мне JamesMLV.

А затем SQL выглядит так:

SELECT dates.date, ISNULL(SUM(ordersubtotal), 0) as Sales FROM [dbo].[DateTable] ('2009-08-01','2009-08-31','day') dates
LEFT JOIN Orders ON CONVERT(VARCHAR(10),Orders.datecreated, 111) = dates.date
group by dates.date
0
ответ дан 7 December 2019 в 12:23
поделиться
SELECT DateCreated,
SUM(SubTotal) AS SalesSum
FROM Orders
GROUP BY DateCreated
-1
ответ дан 7 December 2019 в 12:23
поделиться
declare @oldest_date datetime
declare @daily_sum numeric(18,2)
declare @temp table(
    sales_date datetime,
    sales_sum numeric(18,2)
)
select @oldest_date = dateadd(day,-30,getdate())

while @oldest_date <= getdate()
begin
    set @daily_sum = (select sum(SubTotal) from SalesTable  where DateCreated = @oldest_date)
    insert into @temp(sales_date, sales_sum) values(@oldest_date, @daily_sum)
    set @oldest_date = dateadd(day,1,@oldest_date)
end

select * from @temp

Хорошо, я пропустил ту часть о последних 30 днях. Приведенный выше бит, хотя и не такой чистый, IMHO, как таблица дат, должен работать. Другой вариант - использовать цикл while для заполнения временной таблицы только за последние 30 дней и выполнить левое внешнее соединение с результатом моего исходного запроса.

2
ответ дан 7 December 2019 в 12:23
поделиться

включая те дни без продаж.

Это трудная часть. Не думаю, что первый ответ вам в этом поможет. Я сделал нечто подобное с отдельной таблицей дат.

Вы можете найти инструкции, как это сделать здесь:

Таблица дат

1
ответ дан 7 December 2019 в 12:23
поделиться

(Немного исправлено - я слишком рано нажал Enter)

Я начал ковыряться в этом, и, поскольку он затрагивает некоторые довольно сложные концепции SQL, он быстро превратился в следующий монстр. Если возможно, вам лучше адаптировать решение THEn; или, как советуют многие другие, предпочтительнее использовать код приложения для заполнения пробелов.

--  A temp table holding the 30 dates that you want to check
DECLARE @Foo Table (Date  smalldatetime  not null)

--  Populate the table using a common "tally table" methodology (I got this from SQL Server magazine long ago)
;WITH
  L0 AS (SELECT 1 AS C UNION ALL SELECT 1), --2 rows
  L1 AS (SELECT 1 AS C FROM L0 AS A, L0 AS B),--4 rows
  L2 AS (SELECT 1 AS C FROM L1 AS A, L1 AS B),--16 rows
  L3 AS (SELECT 1 AS C FROM L2 AS A, L2 AS B),--256 rows
  Tally AS (SELECT ROW_NUMBER() OVER(ORDER BY C) AS Number FROM L3)
INSERT @Foo (Date)
 select dateadd(dd, datediff(dd, 0, dateadd(dd, -number + 1, getdate())), 0)
 from Tally
 where Number < 31

Шаг 1 - создать временную таблицу, содержащую 30 дат, которые вас интересуют. Эта абстрактная странность представляет собой самый быстрый из известных способов построить таблицу последовательных целых чисел; добавьте еще несколько подзапросов, и вы сможете заполнить миллионы или больше за считанные секунды. Я беру первые 30 и использую dateadd и текущую дату / время, чтобы преобразовать их в даты. Если у вас уже есть «фиксированная» таблица с 1-30, вы можете использовать ее и полностью пропустить CTE (заменив таблицу «Tally» своей таблицей).

Два внешних вызова функции даты удаляют временную часть сгенерированная строка.

(Обратите внимание, что я предполагаю, что дата вашего заказа также не имеет временной части - иначе вам придется решить еще одну общую проблему.)

Для целей тестирования я построил таблицу #Orders, и она получает остальные:

SELECT f.Date, sum(ordersubtotal) as SalesSum
 from @Foo f
  left outer join #Orders o
   on o.DateCreated = f.Date
 group by f.Date
0
ответ дан 7 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

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